/**
 * 作者：zach
 * 功能说明：自动执行自定义行为
 */
//**【main函数】====================================================================================================【自己的代码全部写在main函数里面】
// main函数内可以使用的对象及工具函数有：context、query、mutation、batch_query、batch_mutation、runGqlImp、errlog、setReturn、runStrJscode
function main(payload = {}) {
	if (!actionflow_name) {
		return setReturn(payload, "失败", `actionflow_name:${actionflow_name},不能为空`);
	}
	let {
		system_id = null,
			system_field_string =
			`id system_id name logo{id url} province city area location address_detail mobile attach_config wx_pub_config wx_mini_config wx_union_config actionflow_config`
	} = payload

	if (system_id || system_id === null) {
		let [system_tmp] = query({
			model: "system",
			limit: 1,
			where: {
				...(system_id === null ? {
					system_id: {
						_eq: system_id
					}
				} : {})
			},
			field_string: system_field_string
		})
		if (system_tmp?.id) {
			default_system_system = system_tmp?.id
			system = system_tmp
		} else {
			return setReturn(system_tmp, "失败", `system_id:${system_id},错误或不存在`);
		}
	}

	// 查询自定义行为
	let [actionflow] = query({
		model: "actionflow",
		limit: 1,
		where: {
			name: {
				_eq: actionflow_name
			}
		},
		field_string: `name jscode attach_data`
	})
	if (!actionflow) {
		return setReturn(payload, "失败", `actionflow_name:${actionflow_name},未定义`);
	}
	attach_data = actionflow?.attach_data || {};
	let jscode = actionflow?.jscode || "";
	return eval(`(()=>{${jscode}})()`);
}

//**【个人工具库】====================================================================================================【自己的工具库可以全部封装在此处方便复用】
// 10进制数子转62进制字符串
function decimalToBase62(number, bit = 6) {
	const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	let code = '';
	while (number > 0) {
		const remainder = number % 62;
		code = alphabet[remainder] + code;
		number = Math.floor(number / 62);
	}
	return code.padStart(bit, '0');
}
// 62进制字符串反转10进制数字
function base62ToDecimal(code) {
	const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	let number = 0;
	for (let i = 0; i < code.length; i++) {
		const char = code[i];
		const digit = alphabet.indexOf(char);
		number = number * 62 + digit;
	}
	return number;
}

// 对象key按ascii码深度排序，可以传Object或Array
function ksort(o) {
	if (typeof o != "object") {
		return o;
	}
	let sorted = {};
	if (Array.isArray(o)) {
		sorted = [];
		o.forEach(obj => {
			sorted.push(ksort(obj));
		})
		return sorted;
	}
	let keys = Object.keys(o);
	keys.sort();
	keys.forEach((key) => {
		if (o[key] && typeof o[key] == "object" && Array.isArray(o[key])) {
			sorted[key] = [];
			o[key].forEach((item, index) => {
				sorted[key].push(ksort(o[key][index]));
			})
		} else if (o[key] && typeof o[key] == "object" && !Array.isArray(o[key])) {
			sorted[key] = ksort(o[key]);
		} else {
			sorted[key] = o[key];
		}
	})
	return sorted;
}

/**
 * 日期格式化
 * @param {*} date
 * @param {*} fmt
 */
function dateFormat(date = false, fmt = "yyyy-MM-dd hh:mm:ss") {
	date = new Date(date ? date : new Date().getTime());
	if (fmt === false) {
		return new Date(date).getTime();
	}
	var a = ['日', '一', '二', '三', '四', '五', '六']
	var o = {
		'M+': date.getMonth() + 1, // 月份
		'd+': date.getDate(), // 日
		'h+': date.getHours(), // 小时
		'm+': date.getMinutes(), // 分
		's+': date.getSeconds(), // 秒
		'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
		'S': date.getMilliseconds(), // 毫秒
		'w': date.getDay(), // 周
		'W': a[date.getDay()], // 大写周
		'T': 'T'
	}
	if (/(y+)/.test(fmt)) {
		fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
	}
	for (var k in o) {
		if (new RegExp('(' + k + ')').test(fmt)) {
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
		}
	}
	return fmt
}

// obj2合并到obj1，对象深度合并
function deepMerge(obj1, obj2) {
	let key;
	for (key in obj2) {
		// 如果target(也就是obj1[key])存在，且是对象的话再去调用deepMerge，否则就是obj1[key]里面没这个对象，需要与obj2[key]合并
		// 如果obj2[key]没有值或者值不是对象，此时直接替换obj1[key]
		obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" && (obj2[key] && obj2[key].toString() ===
			"[object Object]") ? deepMerge(obj1[key], obj2[key]) : (obj1[key] = obj2[key]);
	}
	return obj1;
}

// 通过token获取data数据
function tokenToData(_token = undefined, secret = "md_jwt_secret") {
	if (typeof payload !== "object") {
		return setReturn(payload, "失败", "token无效或不存在")
	}
	let token = _token;
	if (!token) {
		token = payload?.token
	}
	try {
		return verifyJWT(token, secret)
	} catch (e) {
		return setReturn({
			token,
			e: e.message
		}, "token验证不通过", "getTokenByData，token有误," + e.message);
	}
	// 验证jwt token
	function verifyJWT(token, secret = "") {
		if (!token || typeof token !== "string") {
			throw new Error("token格式不正确");
		}
		const [encodedHeader, encodedPayload, signature] = token.split('.');
		const header = JSON.parse(CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(encodedHeader)));
		const jwt_payload = JSON.parse(CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(encodedPayload)));
		if (header.alg !== 'HS256') {
			throw new Error("Invalid JWT algorithm");
		}
		const isValidSignature = signature === CryptoJS.HmacSHA256(`${encodedHeader}.${encodedPayload}`, secret)
			.toString(
				CryptoJS.enc.Base64);
		if (!isValidSignature) {
			throw new Error("Invalid JWT signature");
		}
		let now_time = new Date().getTime();
		if (now_time >= jwt_payload?.expires_in) {
			throw new Error("token已过期，请重新登录");
		}
		return jwt_payload;
	}
}

// 通过data获取token
function dataToToken(payload = {}, secret = "md_jwt_secret") {
	if (!payload?.id) {
		return setReturn(payload, "失败", "dataToToken，生成token失败，payload至少包含id")
	}
	try {
		return generateJWT(payload, secret)
	} catch (e) {
		return setReturn({
			payload,
			e: e.message
		}, "失败", "dataToToken，payload有误," + e.message);
	}

	// 生成jwt token
	function generateJWT(data, secret = "") {
		if (!data || typeof data !== "object") {
			throw new Error("data格式不正确");
		}
		let jwt_payload = {
			...data,
			...data?.expires_in ? {} : {
				expires_in: new Date().getTime() + 1000 * 60 * 60 * 24 * 30
			}
		}
		const header = {
			'alg': 'HS256', // 加密算法
			'typ': 'JWT' // 类型
		};
		const encodedHeader = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(JSON.stringify(header)));
		const encodedPayload = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(JSON.stringify(jwt_payload)));
		const signature = CryptoJS.HmacSHA256(`${encodedHeader}.${encodedPayload}`, secret).toString(CryptoJS.enc
			.Base64);
		let token = `${encodedHeader}.${encodedPayload}.${signature}`;
		return {
			token,
			expires_in: jwt_payload?.expires_in
		}
	}
}

function md5(string, bit) {
	function md5_RotateLeft(lValue, iShiftBits) {
		return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
	}

	function md5_AddUnsigned(lX, lY) {
		var lX4, lY4, lX8, lY8, lResult;
		lX8 = (lX & 0x80000000);
		lY8 = (lY & 0x80000000);
		lX4 = (lX & 0x40000000);
		lY4 = (lY & 0x40000000);
		lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
		if (lX4 & lY4) {
			return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
		}
		if (lX4 | lY4) {
			if (lResult & 0x40000000) {
				return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
			} else {
				return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
			}
		} else {
			return (lResult ^ lX8 ^ lY8);
		}
	}

	function md5_F(x, y, z) {
		return (x & y) | ((~x) & z);
	}

	function md5_G(x, y, z) {
		return (x & z) | (y & (~z));
	}

	function md5_H(x, y, z) {
		return (x ^ y ^ z);
	}

	function md5_I(x, y, z) {
		return (y ^ (x | (~z)));
	}

	function md5_FF(a, b, c, d, x, s, ac) {
		a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_F(b, c, d), x), ac));
		return md5_AddUnsigned(md5_RotateLeft(a, s), b);
	};

	function md5_GG(a, b, c, d, x, s, ac) {
		a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_G(b, c, d), x), ac));
		return md5_AddUnsigned(md5_RotateLeft(a, s), b);
	};

	function md5_HH(a, b, c, d, x, s, ac) {
		a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_H(b, c, d), x), ac));
		return md5_AddUnsigned(md5_RotateLeft(a, s), b);
	};

	function md5_II(a, b, c, d, x, s, ac) {
		a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_I(b, c, d), x), ac));
		return md5_AddUnsigned(md5_RotateLeft(a, s), b);
	};

	function md5_ConvertToWordArray(string) {
		var lWordCount;
		var lMessageLength = string.length;
		var lNumberOfWords_temp1 = lMessageLength + 8;
		var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
		var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
		var lWordArray = Array(lNumberOfWords - 1);
		var lBytePosition = 0;
		var lByteCount = 0;
		while (lByteCount < lMessageLength) {
			lWordCount = (lByteCount - (lByteCount % 4)) / 4;
			lBytePosition = (lByteCount % 4) * 8;
			lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
			lByteCount++;
		}
		lWordCount = (lByteCount - (lByteCount % 4)) / 4;
		lBytePosition = (lByteCount % 4) * 8;
		lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
		lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
		lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
		return lWordArray;
	};

	function md5_WordToHex(lValue) {
		var WordToHexValue = "",
			WordToHexValue_temp = "",
			lByte, lCount;
		for (lCount = 0; lCount <= 3; lCount++) {
			lByte = (lValue >>> (lCount * 8)) & 255;
			WordToHexValue_temp = "0" + lByte.toString(16);
			WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
		}
		return WordToHexValue;
	};

	function md5_Utf8Encode(string) {
		string = string.replace(/\r\n/g, "\n");
		var utftext = "";
		for (var n = 0; n < string.length; n++) {
			var c = string.charCodeAt(n);
			if (c < 128) {
				utftext += String.fromCharCode(c);
			} else if ((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			} else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
		}
		return utftext;
	};
	var x = Array();
	var k, AA, BB, CC, DD, a, b, c, d;
	var S11 = 7,
		S12 = 12,
		S13 = 17,
		S14 = 22;
	var S21 = 5,
		S22 = 9,
		S23 = 14,
		S24 = 20;
	var S31 = 4,
		S32 = 11,
		S33 = 16,
		S34 = 23;
	var S41 = 6,
		S42 = 10,
		S43 = 15,
		S44 = 21;
	string = md5_Utf8Encode(string);
	x = md5_ConvertToWordArray(string);
	a = 0x67452301;
	b = 0xEFCDAB89;
	c = 0x98BADCFE;
	d = 0x10325476;
	for (k = 0; k < x.length; k += 16) {
		AA = a;
		BB = b;
		CC = c;
		DD = d;
		a = md5_FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
		d = md5_FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
		c = md5_FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
		b = md5_FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
		a = md5_FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
		d = md5_FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
		c = md5_FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
		b = md5_FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
		a = md5_FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
		d = md5_FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
		c = md5_FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
		b = md5_FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
		a = md5_FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
		d = md5_FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
		c = md5_FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
		b = md5_FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
		a = md5_GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
		d = md5_GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
		c = md5_GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
		b = md5_GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
		a = md5_GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
		d = md5_GG(d, a, b, c, x[k + 10], S22, 0x2441453);
		c = md5_GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
		b = md5_GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
		a = md5_GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
		d = md5_GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
		c = md5_GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
		b = md5_GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
		a = md5_GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
		d = md5_GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
		c = md5_GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
		b = md5_GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
		a = md5_HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
		d = md5_HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
		c = md5_HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
		b = md5_HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
		a = md5_HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
		d = md5_HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
		c = md5_HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
		b = md5_HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
		a = md5_HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
		d = md5_HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
		c = md5_HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
		b = md5_HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
		a = md5_HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
		d = md5_HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
		c = md5_HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
		b = md5_HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
		a = md5_II(a, b, c, d, x[k + 0], S41, 0xF4292244);
		d = md5_II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
		c = md5_II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
		b = md5_II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
		a = md5_II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
		d = md5_II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
		c = md5_II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
		b = md5_II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
		a = md5_II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
		d = md5_II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
		c = md5_II(c, d, a, b, x[k + 6], S43, 0xA3014314);
		b = md5_II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
		a = md5_II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
		d = md5_II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
		c = md5_II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
		b = md5_II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
		a = md5_AddUnsigned(a, AA);
		b = md5_AddUnsigned(b, BB);
		c = md5_AddUnsigned(c, CC);
		d = md5_AddUnsigned(d, DD);
	}

	function md_32a() {
		return (md5_WordToHex(a) + md5_WordToHex(b) + md5_WordToHex(c) + md5_WordToHex(d)).toLowerCase();
	}

	function md_16a() {
		return (md5_WordToHex(b) + md5_WordToHex(c)).toLowerCase();
	}
	if (bit == 32 || bit == "32a") {
		return md_32a();
	}
	if (bit == 16 || bit == "16a") {
		return md_16a();
	}
	if (bit == '32A') {
		return md_32a().toUpperCase();
	}
	if (bit == '16A') {
		return md_16a().toUpperCase();
	}
	return md_32a();
}

// cryptoJs加密库
let CryptoJS;
(() => {
	var t = {
			239: function(t, e, r) {
				var i, n, o, s, a, c, h, l, f, u, d;
				t.exports = (d = d || function(t, e) {
						var i;
						if ("undefined" != typeof window && window.crypto && (i = window.crypto),
							"undefined" != typeof self && self.crypto && (i = self.crypto), "undefined" !=
							typeof globalThis && globalThis.crypto && (i = globalThis.crypto), !i &&
							"undefined" != typeof window && window.msCrypto && (i = window.msCrypto), !i &&
							void 0 !== r.g && r.g.crypto && (i = r.g.crypto), !i) try {
							i = r(480)
						} catch (t) {}
						var n = function() {
								if (i) {
									if ("function" == typeof i.getRandomValues) try {
										return i.getRandomValues(new Uint32Array(1))[0]
									} catch (t) {}
									if ("function" == typeof i.randomBytes) try {
										return i.randomBytes(4).readInt32LE()
									} catch (t) {}
								}
								throw new Error(
									"Native crypto module could not be used to get secure random number."
								)
							},
							o = Object.create || function() {
								function t() {}
								return function(e) {
									var r;
									return t.prototype = e, r = new t, t.prototype = null, r
								}
							}(),
							s = {},
							a = s.lib = {},
							c = a.Base = {
								extend: function(t) {
									var e = o(this);
									return t && e.mixIn(t), e.hasOwnProperty("init") && this.init !== e
										.init || (e.init = function() {
											e.$super.init.apply(this, arguments)
										}), e.init.prototype = e, e.$super = this, e
								},
								create: function() {
									var t = this.extend();
									return t.init.apply(t, arguments), t
								},
								init: function() {},
								mixIn: function(t) {
									for (var e in t) t.hasOwnProperty(e) && (this[e] = t[e]);
									t.hasOwnProperty("toString") && (this.toString = t.toString)
								},
								clone: function() {
									return this.init.prototype.extend(this)
								}
							},
							h = a.WordArray = c.extend({
								init: function(t, e) {
									t = this.words = t || [], this.sigBytes = null != e ? e : 4 * t
										.length
								},
								toString: function(t) {
									return (t || f).stringify(this)
								},
								concat: function(t) {
									var e = this.words,
										r = t.words,
										i = this.sigBytes,
										n = t.sigBytes;
									if (this.clamp(), i % 4)
										for (var o = 0; o < n; o++) {
											var s = r[o >>> 2] >>> 24 - o % 4 * 8 & 255;
											e[i + o >>> 2] |= s << 24 - (i + o) % 4 * 8
										} else
											for (var a = 0; a < n; a += 4) e[i + a >>> 2] = r[a >>>
												2];
									return this.sigBytes += n, this
								},
								clamp: function() {
									var e = this.words,
										r = this.sigBytes;
									e[r >>> 2] &= 4294967295 << 32 - r % 4 * 8, e.length = t.ceil(
										r / 4)
								},
								clone: function() {
									var t = c.clone.call(this);
									return t.words = this.words.slice(0), t
								},
								random: function(t) {
									for (var e = [], r = 0; r < t; r += 4) e.push(n());
									return new h.init(e, t)
								}
							}),
							l = s.enc = {},
							f = l.Hex = {
								stringify: function(t) {
									for (var e = t.words, r = t.sigBytes, i = [], n = 0; n < r; n++) {
										var o = e[n >>> 2] >>> 24 - n % 4 * 8 & 255;
										i.push((o >>> 4).toString(16)), i.push((15 & o).toString(16))
									}
									return i.join("")
								},
								parse: function(t) {
									for (var e = t.length, r = [], i = 0; i < e; i += 2) r[i >>> 3] |=
										parseInt(t.substr(i, 2), 16) << 24 - i % 8 * 4;
									return new h.init(r, e / 2)
								}
							},
							u = l.Latin1 = {
								stringify: function(t) {
									for (var e = t.words, r = t.sigBytes, i = [], n = 0; n < r; n++) {
										var o = e[n >>> 2] >>> 24 - n % 4 * 8 & 255;
										i.push(String.fromCharCode(o))
									}
									return i.join("")
								},
								parse: function(t) {
									for (var e = t.length, r = [], i = 0; i < e; i++) r[i >>> 2] |= (
										255 & t.charCodeAt(i)) << 24 - i % 4 * 8;
									return new h.init(r, e)
								}
							},
							d = l.Utf8 = {
								stringify: function(t) {
									try {
										return decodeURIComponent(escape(u.stringify(t)))
									} catch (t) {
										throw new Error("Malformed UTF-8 data")
									}
								},
								parse: function(t) {
									return u.parse(unescape(encodeURIComponent(t)))
								}
							},
							p = a.BufferedBlockAlgorithm = c.extend({
								reset: function() {
									this._data = new h.init, this._nDataBytes = 0
								},
								_append: function(t) {
									"string" == typeof t && (t = d.parse(t)), this._data.concat(t),
										this._nDataBytes += t.sigBytes
								},
								_process: function(e) {
									var r, i = this._data,
										n = i.words,
										o = i.sigBytes,
										s = this.blockSize,
										a = o / (4 * s),
										c = (a = e ? t.ceil(a) : t.max((0 | a) - this
											._minBufferSize, 0)) * s,
										l = t.min(4 * c, o);
									if (c) {
										for (var f = 0; f < c; f += s) this._doProcessBlock(n, f);
										r = n.splice(0, c), i.sigBytes -= l
									}
									return new h.init(r, l)
								},
								clone: function() {
									var t = c.clone.call(this);
									return t._data = this._data.clone(), t
								},
								_minBufferSize: 0
							}),
							_ = (a.Hasher = p.extend({
								cfg: c.extend(),
								init: function(t) {
									this.cfg = this.cfg.extend(t), this.reset()
								},
								reset: function() {
									p.reset.call(this), this._doReset()
								},
								update: function(t) {
									return this._append(t), this._process(), this
								},
								finalize: function(t) {
									return t && this._append(t), this._doFinalize()
								},
								blockSize: 16,
								_createHelper: function(t) {
									return function(e, r) {
										return new t.init(r).finalize(e)
									}
								},
								_createHmacHelper: function(t) {
									return function(e, r) {
										return new _.HMAC.init(t, r).finalize(e)
									}
								}
							}), s.algo = {});
						return s
					}(Math), function(t) {
						var e = d,
							r = e.lib,
							i = r.Base,
							n = r.WordArray,
							o = e.x64 = {};
						o.Word = i.extend({
							init: function(t, e) {
								this.high = t, this.low = e
							}
						}), o.WordArray = i.extend({
							init: function(t, e) {
								t = this.words = t || [], this.sigBytes = null != e ? e : 8 * t
									.length
							},
							toX32: function() {
								for (var t = this.words, e = t.length, r = [], i = 0; i <
									e; i++) {
									var o = t[i];
									r.push(o.high), r.push(o.low)
								}
								return n.create(r, this.sigBytes)
							},
							clone: function() {
								for (var t = i.clone.call(this), e = t.words = this.words.slice(
										0), r = e.length, n = 0; n < r; n++) e[n] = e[n]
									.clone();
								return t
							}
						})
					}(), function() {
						if ("function" == typeof ArrayBuffer) {
							var t = d.lib.WordArray,
								e = t.init,
								r = t.init = function(t) {
									if (t instanceof ArrayBuffer && (t = new Uint8Array(t)), (
											t instanceof Int8Array || "undefined" !=
											typeof Uint8ClampedArray && t instanceof Uint8ClampedArray ||
											t instanceof Int16Array || t instanceof Uint16Array ||
											t instanceof Int32Array || t instanceof Uint32Array ||
											t instanceof Float32Array || t instanceof Float64Array) && (t =
											new Uint8Array(t.buffer, t.byteOffset, t.byteLength)),
										t instanceof Uint8Array) {
										for (var r = t.byteLength, i = [], n = 0; n < r; n++) i[n >>> 2] |=
											t[n] << 24 - n % 4 * 8;
										e.call(this, i, r)
									} else e.apply(this, arguments)
								};
							r.prototype = t
						}
					}(), function() {
						var t = d,
							e = t.lib.WordArray,
							r = t.enc;

						function i(t) {
							return t << 8 & 4278255360 | t >>> 8 & 16711935
						}
						r.Utf16 = r.Utf16BE = {
							stringify: function(t) {
								for (var e = t.words, r = t.sigBytes, i = [], n = 0; n < r; n +=
									2) {
									var o = e[n >>> 2] >>> 16 - n % 4 * 8 & 65535;
									i.push(String.fromCharCode(o))
								}
								return i.join("")
							},
							parse: function(t) {
								for (var r = t.length, i = [], n = 0; n < r; n++) i[n >>> 1] |= t
									.charCodeAt(n) << 16 - n % 2 * 16;
								return e.create(i, 2 * r)
							}
						}, r.Utf16LE = {
							stringify: function(t) {
								for (var e = t.words, r = t.sigBytes, n = [], o = 0; o < r; o +=
									2) {
									var s = i(e[o >>> 2] >>> 16 - o % 4 * 8 & 65535);
									n.push(String.fromCharCode(s))
								}
								return n.join("")
							},
							parse: function(t) {
								for (var r = t.length, n = [], o = 0; o < r; o++) n[o >>> 1] |= i(t
									.charCodeAt(o) << 16 - o % 2 * 16);
								return e.create(n, 2 * r)
							}
						}
					}(), function() {
						var t = d,
							e = t.lib.WordArray;
						t.enc.Base64 = {
							stringify: function(t) {
								var e = t.words,
									r = t.sigBytes,
									i = this._map;
								t.clamp();
								for (var n = [], o = 0; o < r; o += 3)
									for (var s = (e[o >>> 2] >>> 24 - o % 4 * 8 & 255) << 16 | (e[
												o + 1 >>> 2] >>> 24 - (o + 1) % 4 * 8 & 255) << 8 |
											e[o + 2 >>> 2] >>> 24 - (o + 2) % 4 * 8 & 255, a =
											0; a < 4 && o + .75 * a < r; a++) n.push(i.charAt(s >>>
										6 * (3 - a) & 63));
								var c = i.charAt(64);
								if (c)
									for (; n.length % 4;) n.push(c);
								return n.join("")
							},
							parse: function(t) {
								var r = t.length,
									i = this._map,
									n = this._reverseMap;
								if (!n) {
									n = this._reverseMap = [];
									for (var o = 0; o < i.length; o++) n[i.charCodeAt(o)] = o
								}
								var s = i.charAt(64);
								if (s) {
									var a = t.indexOf(s); - 1 !== a && (r = a)
								}
								return function(t, r, i) {
									for (var n = [], o = 0, s = 0; s < r; s++)
										if (s % 4) {
											var a = i[t.charCodeAt(s - 1)] << s % 4 * 2 | i[t
												.charCodeAt(s)] >>> 6 - s % 4 * 2;
											n[o >>> 2] |= a << 24 - o % 4 * 8, o++
										} return e.create(n, o)
								}(t, r, n)
							},
							_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
						}
					}(), function() {
						var t = d,
							e = t.lib.WordArray;
						t.enc.Base64url = {
							stringify: function(t, e = !0) {
								var r = t.words,
									i = t.sigBytes,
									n = e ? this._safe_map : this._map;
								t.clamp();
								for (var o = [], s = 0; s < i; s += 3)
									for (var a = (r[s >>> 2] >>> 24 - s % 4 * 8 & 255) << 16 | (r[
												s + 1 >>> 2] >>> 24 - (s + 1) % 4 * 8 & 255) << 8 |
											r[s + 2 >>> 2] >>> 24 - (s + 2) % 4 * 8 & 255, c =
											0; c < 4 && s + .75 * c < i; c++) o.push(n.charAt(a >>>
										6 * (3 - c) & 63));
								var h = n.charAt(64);
								if (h)
									for (; o.length % 4;) o.push(h);
								return o.join("")
							},
							parse: function(t, r = !0) {
								var i = t.length,
									n = r ? this._safe_map : this._map,
									o = this._reverseMap;
								if (!o) {
									o = this._reverseMap = [];
									for (var s = 0; s < n.length; s++) o[n.charCodeAt(s)] = s
								}
								var a = n.charAt(64);
								if (a) {
									var c = t.indexOf(a); - 1 !== c && (i = c)
								}
								return function(t, r, i) {
									for (var n = [], o = 0, s = 0; s < r; s++)
										if (s % 4) {
											var a = i[t.charCodeAt(s - 1)] << s % 4 * 2 | i[t
												.charCodeAt(s)] >>> 6 - s % 4 * 2;
											n[o >>> 2] |= a << 24 - o % 4 * 8, o++
										} return e.create(n, o)
								}(t, i, o)
							},
							_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
							_safe_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
						}
					}(), function(t) {
						var e = d,
							r = e.lib,
							i = r.WordArray,
							n = r.Hasher,
							o = e.algo,
							s = [];
						! function() {
							for (var e = 0; e < 64; e++) s[e] = 4294967296 * t.abs(t.sin(e + 1)) | 0
						}();
						var a = o.MD5 = n.extend({
							_doReset: function() {
								this._hash = new i.init([1732584193, 4023233417, 2562383102,
									271733878
								])
							},
							_doProcessBlock: function(t, e) {
								for (var r = 0; r < 16; r++) {
									var i = e + r,
										n = t[i];
									t[i] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n <<
										24 | n >>> 8)
								}
								var o = this._hash.words,
									a = t[e + 0],
									u = t[e + 1],
									d = t[e + 2],
									p = t[e + 3],
									_ = t[e + 4],
									v = t[e + 5],
									y = t[e + 6],
									g = t[e + 7],
									B = t[e + 8],
									w = t[e + 9],
									k = t[e + 10],
									m = t[e + 11],
									S = t[e + 12],
									x = t[e + 13],
									b = t[e + 14],
									A = t[e + 15],
									H = o[0],
									z = o[1],
									C = o[2],
									D = o[3];
								H = c(H, z, C, D, a, 7, s[0]), D = c(D, H, z, C, u, 12, s[1]),
									C = c(C, D, H, z, d, 17, s[2]), z = c(z, C, D, H, p, 22, s[
										3]), H = c(H, z, C, D, _, 7, s[4]), D = c(D, H, z, C, v,
										12, s[5]), C = c(C, D, H, z, y, 17, s[6]), z = c(z, C,
										D, H, g, 22, s[7]), H = c(H, z, C, D, B, 7, s[8]), D =
									c(D, H, z, C, w, 12, s[9]), C = c(C, D, H, z, k, 17, s[10]),
									z = c(z, C, D, H, m, 22, s[11]), H = c(H, z, C, D, S, 7, s[
										12]), D = c(D, H, z, C, x, 12, s[13]), C = c(C, D, H, z,
										b, 17, s[14]), H = h(H, z = c(z, C, D, H, A, 22, s[15]),
										C, D, u, 5, s[16]), D = h(D, H, z, C, y, 9, s[17]), C =
									h(C, D, H, z, m, 14, s[18]), z = h(z, C, D, H, a, 20, s[
										19]), H = h(H, z, C, D, v, 5, s[20]), D = h(D, H, z, C,
										k,
										9, s[21]), C = h(C, D, H, z, A, 14, s[22]), z = h(z, C,
										D, H, _, 20, s[23]), H = h(H, z, C, D, w, 5, s[24]), D =
									h(D, H, z, C, b, 9, s[25]), C = h(C, D, H, z, p, 14, s[26]),
									z = h(z, C, D, H, B, 20, s[27]), H = h(H, z, C, D, x, 5, s[
										28]), D = h(D, H, z, C, d, 9, s[29]), C = h(C, D, H, z,
										g, 14, s[30]), H = l(H, z = h(z, C, D, H, S, 20, s[31]),
										C, D, v, 4, s[32]), D = l(D, H, z, C, B, 11, s[33]), C =
									l(C, D, H, z, m, 16, s[34]), z = l(z, C, D, H, b, 23, s[
										35]), H = l(H, z, C, D, u, 4, s[36]), D = l(D, H, z, C,
										_,
										11, s[37]), C = l(C, D, H, z, g, 16, s[38]), z = l(z, C,
										D, H, k, 23, s[39]), H = l(H, z, C, D, x, 4, s[40]), D =
									l(D, H, z, C, a, 11, s[41]), C = l(C, D, H, z, p, 16, s[
										42]), z = l(z, C, D, H, y, 23, s[43]), H = l(H, z, C, D,
										w,
										4, s[44]), D = l(D, H, z, C, S, 11, s[45]), C = l(C, D,
										H, z, A, 16, s[46]), H = f(H, z = l(z, C, D, H, d, 23,
										s[47]), C, D, a, 6, s[48]), D = f(D, H, z, C, g, 10, s[
										49]), C = f(C, D, H, z, b, 15, s[50]), z = f(z, C, D, H,
										v, 21, s[51]), H = f(H, z, C, D, S, 6, s[52]), D = f(D,
										H, z, C, p, 10, s[53]), C = f(C, D, H, z, k, 15, s[54]),
									z = f(z, C, D, H, u, 21, s[55]), H = f(H, z, C, D, B, 6, s[
										56]), D = f(D, H, z, C, A, 10, s[57]), C = f(C, D, H, z,
										y, 15, s[58]), z = f(z, C, D, H, x, 21, s[59]), H = f(H,
										z, C, D, _, 6, s[60]), D = f(D, H, z, C, m, 10, s[61]),
									C = f(C, D, H, z, d, 15, s[62]), z = f(z, C, D, H, w, 21, s[
										63]), o[0] = o[0] + H | 0, o[1] = o[1] + z | 0, o[2] =
									o[2] + C | 0, o[3] = o[3] + D | 0
							},
							_doFinalize: function() {
								var e = this._data,
									r = e.words,
									i = 8 * this._nDataBytes,
									n = 8 * e.sigBytes;
								r[n >>> 5] |= 128 << 24 - n % 32;
								var o = t.floor(i / 4294967296),
									s = i;
								r[15 + (n + 64 >>> 9 << 4)] = 16711935 & (o << 8 | o >>> 24) |
									4278255360 & (o << 24 | o >>> 8), r[14 + (n + 64 >>> 9 <<
										4)] = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (
										s << 24 | s >>> 8), e.sigBytes = 4 * (r.length + 1),
									this._process();
								for (var a = this._hash, c = a.words, h = 0; h < 4; h++) {
									var l = c[h];
									c[h] = 16711935 & (l << 8 | l >>> 24) | 4278255360 & (l <<
										24 | l >>> 8)
								}
								return a
							},
							clone: function() {
								var t = n.clone.call(this);
								return t._hash = this._hash.clone(), t
							}
						});

						function c(t, e, r, i, n, o, s) {
							var a = t + (e & r | ~e & i) + n + s;
							return (a << o | a >>> 32 - o) + e
						}

						function h(t, e, r, i, n, o, s) {
							var a = t + (e & i | r & ~i) + n + s;
							return (a << o | a >>> 32 - o) + e
						}

						function l(t, e, r, i, n, o, s) {
							var a = t + (e ^ r ^ i) + n + s;
							return (a << o | a >>> 32 - o) + e
						}

						function f(t, e, r, i, n, o, s) {
							var a = t + (r ^ (e | ~i)) + n + s;
							return (a << o | a >>> 32 - o) + e
						}
						e.MD5 = n._createHelper(a), e.HmacMD5 = n._createHmacHelper(a)
					}(Math), a = (s = d).lib, c = a.WordArray, h = a.Hasher, l = s.algo, f = [], u = l
					.SHA1 = h.extend({
						_doReset: function() {
							this._hash = new c.init([1732584193, 4023233417, 2562383102, 271733878,
								3285377520
							])
						},
						_doProcessBlock: function(t, e) {
							for (var r = this._hash.words, i = r[0], n = r[1], o = r[2], s = r[3],
									a = r[4], c = 0; c < 80; c++) {
								if (c < 16) f[c] = 0 | t[e + c];
								else {
									var h = f[c - 3] ^ f[c - 8] ^ f[c - 14] ^ f[c - 16];
									f[c] = h << 1 | h >>> 31
								}
								var l = (i << 5 | i >>> 27) + a + f[c];
								l += c < 20 ? 1518500249 + (n & o | ~n & s) : c < 40 ? 1859775393 +
									(n ^ o ^ s) : c < 60 ? (n & o | n & s | o & s) - 1894007588 : (
										n ^ o ^ s) - 899497514, a = s, s = o, o = n << 30 | n >>> 2,
									n = i, i = l
							}
							r[0] = r[0] + i | 0, r[1] = r[1] + n | 0, r[2] = r[2] + o | 0, r[3] = r[
								3] + s | 0, r[4] = r[4] + a | 0
						},
						_doFinalize: function() {
							var t = this._data,
								e = t.words,
								r = 8 * this._nDataBytes,
								i = 8 * t.sigBytes;
							return e[i >>> 5] |= 128 << 24 - i % 32, e[14 + (i + 64 >>> 9 << 4)] =
								Math.floor(r / 4294967296), e[15 + (i + 64 >>> 9 << 4)] = r, t
								.sigBytes = 4 * e.length, this._process(), this._hash
						},
						clone: function() {
							var t = h.clone.call(this);
							return t._hash = this._hash.clone(), t
						}
					}), s.SHA1 = h._createHelper(u), s.HmacSHA1 = h._createHmacHelper(u),
					function(t) {
						var e = d,
							r = e.lib,
							i = r.WordArray,
							n = r.Hasher,
							o = e.algo,
							s = [],
							a = [];
						! function() {
							function e(e) {
								for (var r = t.sqrt(e), i = 2; i <= r; i++)
									if (!(e % i)) return !1;
								return !0
							}

							function r(t) {
								return 4294967296 * (t - (0 | t)) | 0
							}
							for (var i = 2, n = 0; n < 64;) e(i) && (n < 8 && (s[n] = r(t.pow(i, .5))), a[
								n] = r(t.pow(i, 1 / 3)), n++), i++
						}();
						var c = [],
							h = o.SHA256 = n.extend({
								_doReset: function() {
									this._hash = new i.init(s.slice(0))
								},
								_doProcessBlock: function(t, e) {
									for (var r = this._hash.words, i = r[0], n = r[1], o = r[2], s =
											r[3], h = r[4], l = r[5], f = r[6], u = r[7], d = 0; d <
										64; d++) {
										if (d < 16) c[d] = 0 | t[e + d];
										else {
											var p = c[d - 15],
												_ = (p << 25 | p >>> 7) ^ (p << 14 | p >>> 18) ^
												p >>> 3,
												v = c[d - 2],
												y = (v << 15 | v >>> 17) ^ (v << 13 | v >>> 19) ^
												v >>> 10;
											c[d] = _ + c[d - 7] + y + c[d - 16]
										}
										var g = i & n ^ i & o ^ n & o,
											B = (i << 30 | i >>> 2) ^ (i << 19 | i >>> 13) ^ (i <<
												10 | i >>> 22),
											w = u + ((h << 26 | h >>> 6) ^ (h << 21 | h >>> 11) ^ (
												h << 7 | h >>> 25)) + (h & l ^ ~h & f) + a[d] + c[
												d];
										u = f, f = l, l = h, h = s + w | 0, s = o, o = n, n = i, i =
											w + (B + g) | 0
									}
									r[0] = r[0] + i | 0, r[1] = r[1] + n | 0, r[2] = r[2] + o | 0,
										r[3] = r[3] + s | 0, r[4] = r[4] + h | 0, r[5] = r[5] + l |
										0, r[6] = r[6] + f | 0, r[7] = r[7] + u | 0
								},
								_doFinalize: function() {
									var e = this._data,
										r = e.words,
										i = 8 * this._nDataBytes,
										n = 8 * e.sigBytes;
									return r[n >>> 5] |= 128 << 24 - n % 32, r[14 + (n + 64 >>> 9 <<
											4)] = t.floor(i / 4294967296), r[15 + (n + 64 >>> 9 <<
											4)] = i, e.sigBytes = 4 * r.length, this._process(),
										this._hash
								},
								clone: function() {
									var t = n.clone.call(this);
									return t._hash = this._hash.clone(), t
								}
							});
						e.SHA256 = n._createHelper(h), e.HmacSHA256 = n._createHmacHelper(h)
					}(Math),
					function() {
						var t = d,
							e = t.lib.WordArray,
							r = t.algo,
							i = r.SHA256,
							n = r.SHA224 = i.extend({
								_doReset: function() {
									this._hash = new e.init([3238371032, 914150663, 812702999,
										4144912697, 4290775857, 1750603025, 1694076839,
										3204075428
									])
								},
								_doFinalize: function() {
									var t = i._doFinalize.call(this);
									return t.sigBytes -= 4, t
								}
							});
						t.SHA224 = i._createHelper(n), t.HmacSHA224 = i._createHmacHelper(n)
					}(),
					function() {
						var t = d,
							e = t.lib.Hasher,
							r = t.x64,
							i = r.Word,
							n = r.WordArray,
							o = t.algo;

						function s() {
							return i.create.apply(i, arguments)
						}
						var a = [s(1116352408, 3609767458), s(1899447441, 602891725), s(3049323471,
								3964484399), s(3921009573, 2173295548), s(961987163, 4081628472), s(
								1508970993, 3053834265), s(2453635748, 2937671579), s(2870763221,
								3664609560), s(3624381080, 2734883394), s(310598401, 1164996542), s(
								607225278, 1323610764), s(1426881987, 3590304994), s(1925078388,
								4068182383), s(2162078206, 991336113), s(2614888103, 633803317), s(
								3248222580, 3479774868), s(3835390401, 2666613458), s(4022224774,
								944711139), s(264347078, 2341262773), s(604807628, 2007800933), s(
								770255983, 1495990901), s(1249150122, 1856431235), s(1555081692,
								3175218132), s(1996064986, 2198950837), s(2554220882, 3999719339), s(
								2821834349, 766784016), s(2952996808, 2566594879), s(3210313671,
								3203337956), s(3336571891, 1034457026), s(3584528711, 2466948901), s(
								113926993, 3758326383), s(338241895, 168717936), s(666307205,
								1188179964), s(773529912, 1546045734), s(1294757372, 1522805485), s(
								1396182291, 2643833823), s(1695183700, 2343527390), s(1986661051,
								1014477480), s(2177026350, 1206759142), s(2456956037, 344077627), s(
								2730485921, 1290863460), s(2820302411, 3158454273), s(3259730800,
								3505952657), s(3345764771, 106217008), s(3516065817, 3606008344), s(
								3600352804, 1432725776), s(4094571909, 1467031594), s(275423344,
								851169720), s(430227734, 3100823752), s(506948616, 1363258195), s(
								659060556, 3750685593), s(883997877, 3785050280), s(958139571,
								3318307427), s(1322822218, 3812723403), s(1537002063, 2003034995), s(
								1747873779, 3602036899), s(1955562222, 1575990012), s(2024104815,
								1125592928), s(2227730452, 2716904306), s(2361852424, 442776044), s(
								2428436474, 593698344), s(2756734187, 3733110249), s(3204031479,
								2999351573), s(3329325298, 3815920427), s(3391569614, 3928383900), s(
								3515267271, 566280711), s(3940187606, 3454069534), s(4118630271,
								4000239992), s(116418474, 1914138554), s(174292421, 2731055270), s(
								289380356, 3203993006), s(460393269, 320620315), s(685471733,
								587496836), s(852142971, 1086792851), s(1017036298, 365543100), s(
								1126000580, 2618297676), s(1288033470, 3409855158), s(1501505948,
								4234509866), s(1607167915, 987167468), s(1816402316, 1246189591)],
							c = [];
						! function() {
							for (var t = 0; t < 80; t++) c[t] = s()
						}();
						var h = o.SHA512 = e.extend({
							_doReset: function() {
								this._hash = new n.init([new i.init(1779033703, 4089235720),
									new i.init(3144134277, 2227873595), new i.init(
										1013904242, 4271175723), new i.init(2773480762,
										1595750129), new i.init(1359893119, 2917565137),
									new i.init(2600822924, 725511199), new i.init(
										528734635, 4215389547), new i.init(1541459225,
										327033209)
								])
							},
							_doProcessBlock: function(t, e) {
								for (var r = this._hash.words, i = r[0], n = r[1], o = r[2], s =
										r[3], h = r[4], l = r[5], f = r[6], u = r[7], d = i
										.high, p = i.low, _ = n.high, v = n.low, y = o.high, g =
										o.low, B = s.high, w = s.low, k = h.high, m = h.low, S =
										l.high, x = l.low, b = f.high, A = f.low, H = u.high,
										z = u.low, C = d, D = p, E = _, R = v, M = y, F = g, P =
										B, W = w, O = k, I = m, U = S, K = x, X = b, j = A, L =
										H, T = z, N = 0; N < 80; N++) {
									var Z, q, V = c[N];
									if (N < 16) q = V.high = 0 | t[e + 2 * N], Z = V.low = 0 |
										t[e + 2 * N + 1];
									else {
										var G = c[N - 15],
											J = G.high,
											Q = G.low,
											Y = (J >>> 1 | Q << 31) ^ (J >>> 8 | Q << 24) ^
											J >>> 7,
											$ = (Q >>> 1 | J << 31) ^ (Q >>> 8 | J << 24) ^ (
												Q >>> 7 | J << 25),
											tt = c[N - 2],
											et = tt.high,
											rt = tt.low,
											it = (et >>> 19 | rt << 13) ^ (et << 3 | rt >>>
												29) ^ et >>> 6,
											nt = (rt >>> 19 | et << 13) ^ (rt << 3 | et >>>
												29) ^ (rt >>> 6 | et << 26),
											ot = c[N - 7],
											st = ot.high,
											at = ot.low,
											ct = c[N - 16],
											ht = ct.high,
											lt = ct.low;
										q = (q = (q = Y + st + ((Z = $ + at) >>> 0 < $ >>> 0 ?
											1 : 0)) + it + ((Z += nt) >>> 0 < nt >>> 0 ?
											1 : 0)) + ht + ((Z += lt) >>> 0 < lt >>> 0 ? 1 :
											0), V.high = q, V.low = Z
									}
									var ft, ut = O & U ^ ~O & X,
										dt = I & K ^ ~I & j,
										pt = C & E ^ C & M ^ E & M,
										_t = D & R ^ D & F ^ R & F,
										vt = (C >>> 28 | D << 4) ^ (C << 30 | D >>> 2) ^ (C <<
											25 | D >>> 7),
										yt = (D >>> 28 | C << 4) ^ (D << 30 | C >>> 2) ^ (D <<
											25 | C >>> 7),
										gt = (O >>> 14 | I << 18) ^ (O >>> 18 | I << 14) ^ (O <<
											23 | I >>> 9),
										Bt = (I >>> 14 | O << 18) ^ (I >>> 18 | O << 14) ^ (I <<
											23 | O >>> 9),
										wt = a[N],
										kt = wt.high,
										mt = wt.low,
										St = L + gt + ((ft = T + Bt) >>> 0 < T >>> 0 ? 1 : 0),
										xt = yt + _t;
									L = X, T = j, X = U, j = K, U = O, K = I, O = P + (St = (
											St = (St = St + ut + ((ft += dt) >>> 0 < dt >>>
												0 ? 1 : 0)) + kt + ((ft += mt) >>> 0 <
												mt >>> 0 ? 1 : 0)) + q + ((ft += Z) >>> 0 <
											Z >>> 0 ? 1 : 0)) + ((I = W + ft | 0) >>> 0 < W >>>
											0 ? 1 : 0) | 0, P = M, W = F, M = E, F = R, E = C,
										R = D, C = St + (vt + pt + (xt >>> 0 < yt >>> 0 ? 1 :
											0)) + ((D = ft + xt | 0) >>> 0 < ft >>> 0 ? 1 : 0) |
										0
								}
								p = i.low = p + D, i.high = d + C + (p >>> 0 < D >>> 0 ? 1 : 0),
									v = n.low = v + R, n.high = _ + E + (v >>> 0 < R >>> 0 ? 1 :
										0), g = o.low = g + F, o.high = y + M + (g >>> 0 < F >>>
										0 ? 1 : 0), w = s.low = w + W, s.high = B + P + (w >>>
										0 < W >>> 0 ? 1 : 0), m = h.low = m + I, h.high = k +
									O + (m >>> 0 < I >>> 0 ? 1 : 0), x = l.low = x + K, l.high =
									S + U + (x >>> 0 < K >>> 0 ? 1 : 0), A = f.low = A + j, f
									.high = b + X + (A >>> 0 < j >>> 0 ? 1 : 0), z = u.low = z +
									T, u.high = H + L + (z >>> 0 < T >>> 0 ? 1 : 0)
							},
							_doFinalize: function() {
								var t = this._data,
									e = t.words,
									r = 8 * this._nDataBytes,
									i = 8 * t.sigBytes;
								return e[i >>> 5] |= 128 << 24 - i % 32, e[30 + (i + 128 >>>
										10 << 5)] = Math.floor(r / 4294967296), e[31 + (i +
										128 >>> 10 << 5)] = r, t.sigBytes = 4 * e.length, this
									._process(), this._hash.toX32()
							},
							clone: function() {
								var t = e.clone.call(this);
								return t._hash = this._hash.clone(), t
							},
							blockSize: 32
						});
						t.SHA512 = e._createHelper(h), t.HmacSHA512 = e._createHmacHelper(h)
					}(),
					function() {
						var t = d,
							e = t.x64,
							r = e.Word,
							i = e.WordArray,
							n = t.algo,
							o = n.SHA512,
							s = n.SHA384 = o.extend({
								_doReset: function() {
									this._hash = new i.init([new r.init(3418070365, 3238371032),
										new r.init(1654270250, 914150663), new r.init(
											2438529370, 812702999), new r.init(355462360,
											4144912697), new r.init(1731405415, 4290775857),
										new r.init(2394180231, 1750603025), new r.init(
											3675008525, 1694076839), new r.init(1203062813,
											3204075428)
									])
								},
								_doFinalize: function() {
									var t = o._doFinalize.call(this);
									return t.sigBytes -= 16, t
								}
							});
						t.SHA384 = o._createHelper(s), t.HmacSHA384 = o._createHmacHelper(s)
					}(),
					function(t) {
						var e = d,
							r = e.lib,
							i = r.WordArray,
							n = r.Hasher,
							o = e.x64.Word,
							s = e.algo,
							a = [],
							c = [],
							h = [];
						! function() {
							for (var t = 1, e = 0, r = 0; r < 24; r++) {
								a[t + 5 * e] = (r + 1) * (r + 2) / 2 % 64;
								var i = (2 * t + 3 * e) % 5;
								t = e % 5, e = i
							}
							for (t = 0; t < 5; t++)
								for (e = 0; e < 5; e++) c[t + 5 * e] = e + (2 * t + 3 * e) % 5 * 5;
							for (var n = 1, s = 0; s < 24; s++) {
								for (var l = 0, f = 0, u = 0; u < 7; u++) {
									if (1 & n) {
										var d = (1 << u) - 1;
										d < 32 ? f ^= 1 << d : l ^= 1 << d - 32
									}
									128 & n ? n = n << 1 ^ 113 : n <<= 1
								}
								h[s] = o.create(l, f)
							}
						}();
						var l = [];
						! function() {
							for (var t = 0; t < 25; t++) l[t] = o.create()
						}();
						var f = s.SHA3 = n.extend({
							cfg: n.cfg.extend({
								outputLength: 512
							}),
							_doReset: function() {
								for (var t = this._state = [], e = 0; e < 25; e++) t[e] = new o
									.init;
								this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32
							},
							_doProcessBlock: function(t, e) {
								for (var r = this._state, i = this.blockSize / 2, n = 0; n <
									i; n++) {
									var o = t[e + 2 * n],
										s = t[e + 2 * n + 1];
									o = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 |
											o >>> 8), s = 16711935 & (s << 8 | s >>> 24) |
										4278255360 & (s << 24 | s >>> 8), (z = r[n]).high ^= s,
										z.low ^= o
								}
								for (var f = 0; f < 24; f++) {
									for (var u = 0; u < 5; u++) {
										for (var d = 0, p = 0, _ = 0; _ < 5; _++) d ^= (z = r[
											u + 5 * _]).high, p ^= z.low;
										var v = l[u];
										v.high = d, v.low = p
									}
									for (u = 0; u < 5; u++) {
										var y = l[(u + 4) % 5],
											g = l[(u + 1) % 5],
											B = g.high,
											w = g.low;
										for (d = y.high ^ (B << 1 | w >>> 31), p = y.low ^ (w <<
												1 | B >>> 31), _ = 0; _ < 5; _++)(z = r[u + 5 *
											_]).high ^= d, z.low ^= p
									}
									for (var k = 1; k < 25; k++) {
										var m = (z = r[k]).high,
											S = z.low,
											x = a[k];
										x < 32 ? (d = m << x | S >>> 32 - x, p = S << x | m >>>
											32 - x) : (d = S << x - 32 | m >>> 64 - x, p =
											m << x - 32 | S >>> 64 - x);
										var b = l[c[k]];
										b.high = d, b.low = p
									}
									var A = l[0],
										H = r[0];
									for (A.high = H.high, A.low = H.low, u = 0; u < 5; u++)
										for (_ = 0; _ < 5; _++) {
											var z = r[k = u + 5 * _],
												C = l[k],
												D = l[(u + 1) % 5 + 5 * _],
												E = l[(u + 2) % 5 + 5 * _];
											z.high = C.high ^ ~D.high & E.high, z.low = C.low ^
												~D.low & E.low
										}
									z = r[0];
									var R = h[f];
									z.high ^= R.high, z.low ^= R.low
								}
							},
							_doFinalize: function() {
								var e = this._data,
									r = e.words,
									n = (this._nDataBytes, 8 * e.sigBytes),
									o = 32 * this.blockSize;
								r[n >>> 5] |= 1 << 24 - n % 32, r[(t.ceil((n + 1) / o) * o >>>
										5) - 1] |= 128, e.sigBytes = 4 * r.length, this
									._process();
								for (var s = this._state, a = this.cfg.outputLength / 8, c = a /
										8, h = [], l = 0; l < c; l++) {
									var f = s[l],
										u = f.high,
										d = f.low;
									u = 16711935 & (u << 8 | u >>> 24) | 4278255360 & (u << 24 |
											u >>> 8), d = 16711935 & (d << 8 | d >>> 24) |
										4278255360 & (d << 24 | d >>> 8), h.push(d), h.push(u)
								}
								return new i.init(h, a)
							},
							clone: function() {
								for (var t = n.clone.call(this), e = t._state = this._state
										.slice(0), r = 0; r < 25; r++) e[r] = e[r].clone();
								return t
							}
						});
						e.SHA3 = n._createHelper(f), e.HmacSHA3 = n._createHmacHelper(f)
					}(Math),
					function(t) {
						var e = d,
							r = e.lib,
							i = r.WordArray,
							n = r.Hasher,
							o = e.algo,
							s = i.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1,
								10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2,
								7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5,
								6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
							]),
							a = i.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7,
								0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11,
								8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7,
								10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
							]),
							c = i.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8,
								13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13,
								15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5,
								6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
							]),
							h = i.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15,
								7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14,
								12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9,
								12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
							]),
							l = i.create([0, 1518500249, 1859775393, 2400959708, 2840853838]),
							f = i.create([1352829926, 1548603684, 1836072691, 2053994217, 0]),
							u = o.RIPEMD160 = n.extend({
								_doReset: function() {
									this._hash = i.create([1732584193, 4023233417, 2562383102,
										271733878, 3285377520
									])
								},
								_doProcessBlock: function(t, e) {
									for (var r = 0; r < 16; r++) {
										var i = e + r,
											n = t[i];
										t[i] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n <<
											24 | n >>> 8)
									}
									var o, u, d, w, k, m, S, x, b, A, H, z = this._hash.words,
										C = l.words,
										D = f.words,
										E = s.words,
										R = a.words,
										M = c.words,
										F = h.words;
									for (m = o = z[0], S = u = z[1], x = d = z[2], b = w = z[3], A =
										k = z[4], r = 0; r < 80; r += 1) H = o + t[e + E[r]] | 0,
										H += r < 16 ? p(u, d, w) + C[0] : r < 32 ? _(u, d, w) + C[
											1] : r < 48 ? v(u, d, w) + C[2] : r < 64 ? y(u, d, w) +
										C[
											3] : g(u, d, w) + C[4], H = (H = B(H |= 0, M[r])) + k |
										0,
										o = k, k = w, w = B(d, 10), d = u, u = H, H = m + t[e + R[
											r]] | 0, H += r < 16 ? g(S, x, b) + D[0] : r < 32 ? y(S,
											x, b) + D[1] : r < 48 ? v(S, x, b) + D[2] : r < 64 ? _(
											S, x, b) + D[3] : p(S, x, b) + D[4], H = (H = B(H |= 0,
											F[r])) + A | 0, m = A, A = b, b = B(x, 10), x = S, S =
										H;
									H = z[1] + d + b | 0, z[1] = z[2] + w + A | 0, z[2] = z[3] + k +
										m | 0, z[3] = z[4] + o + S | 0, z[4] = z[0] + u + x | 0, z[
											0] = H
								},
								_doFinalize: function() {
									var t = this._data,
										e = t.words,
										r = 8 * this._nDataBytes,
										i = 8 * t.sigBytes;
									e[i >>> 5] |= 128 << 24 - i % 32, e[14 + (i + 64 >>> 9 << 4)] =
										16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 |
											r >>> 8), t.sigBytes = 4 * (e.length + 1), this
										._process();
									for (var n = this._hash, o = n.words, s = 0; s < 5; s++) {
										var a = o[s];
										o[s] = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a <<
											24 | a >>> 8)
									}
									return n
								},
								clone: function() {
									var t = n.clone.call(this);
									return t._hash = this._hash.clone(), t
								}
							});

						function p(t, e, r) {
							return t ^ e ^ r
						}

						function _(t, e, r) {
							return t & e | ~t & r
						}

						function v(t, e, r) {
							return (t | ~e) ^ r
						}

						function y(t, e, r) {
							return t & r | e & ~r
						}

						function g(t, e, r) {
							return t ^ (e | ~r)
						}

						function B(t, e) {
							return t << e | t >>> 32 - e
						}
						e.RIPEMD160 = n._createHelper(u), e.HmacRIPEMD160 = n._createHmacHelper(u)
					}(Math),
					function() {
						var t = d,
							e = t.lib.Base,
							r = t.enc.Utf8;
						t.algo.HMAC = e.extend({
							init: function(t, e) {
								t = this._hasher = new t.init, "string" == typeof e && (e = r
									.parse(e));
								var i = t.blockSize,
									n = 4 * i;
								e.sigBytes > n && (e = t.finalize(e)), e.clamp();
								for (var o = this._oKey = e.clone(), s = this._iKey = e.clone(),
										a = o.words, c = s.words, h = 0; h < i; h++) a[h] ^=
									1549556828, c[h] ^= 909522486;
								o.sigBytes = s.sigBytes = n, this.reset()
							},
							reset: function() {
								var t = this._hasher;
								t.reset(), t.update(this._iKey)
							},
							update: function(t) {
								return this._hasher.update(t), this
							},
							finalize: function(t) {
								var e = this._hasher,
									r = e.finalize(t);
								return e.reset(), e.finalize(this._oKey.clone().concat(r))
							}
						})
					}(),
					function() {
						var t = d,
							e = t.lib,
							r = e.Base,
							i = e.WordArray,
							n = t.algo,
							o = n.SHA1,
							s = n.HMAC,
							a = n.PBKDF2 = r.extend({
								cfg: r.extend({
									keySize: 4,
									hasher: o,
									iterations: 1
								}),
								init: function(t) {
									this.cfg = this.cfg.extend(t)
								},
								compute: function(t, e) {
									for (var r = this.cfg, n = s.create(r.hasher, t), o = i
											.create(), a = i.create([1]), c = o.words, h = a.words,
											l =
											r.keySize, f = r.iterations; c.length < l;) {
										var u = n.update(e).finalize(a);
										n.reset();
										for (var d = u.words, p = d.length, _ = u, v = 1; v <
											f; v++) {
											_ = n.finalize(_), n.reset();
											for (var y = _.words, g = 0; g < p; g++) d[g] ^= y[g]
										}
										o.concat(u), h[0]++
									}
									return o.sigBytes = 4 * l, o
								}
							});
						t.PBKDF2 = function(t, e, r) {
							return a.create(r).compute(t, e)
						}
					}(),
					function() {
						var t = d,
							e = t.lib,
							r = e.Base,
							i = e.WordArray,
							n = t.algo,
							o = n.MD5,
							s = n.EvpKDF = r.extend({
								cfg: r.extend({
									keySize: 4,
									hasher: o,
									iterations: 1
								}),
								init: function(t) {
									this.cfg = this.cfg.extend(t)
								},
								compute: function(t, e) {
									for (var r, n = this.cfg, o = n.hasher.create(), s = i.create(),
											a = s.words, c = n.keySize, h = n.iterations; a.length <
										c;) {
										r && o.update(r), r = o.update(t).finalize(e), o.reset();
										for (var l = 1; l < h; l++) r = o.finalize(r), o.reset();
										s.concat(r)
									}
									return s.sigBytes = 4 * c, s
								}
							});
						t.EvpKDF = function(t, e, r) {
							return s.create(r).compute(t, e)
						}
					}(), d.lib.Cipher || function(t) {
						var e = d,
							r = e.lib,
							i = r.Base,
							n = r.WordArray,
							o = r.BufferedBlockAlgorithm,
							s = e.enc,
							a = (s.Utf8, s.Base64),
							c = e.algo.EvpKDF,
							h = r.Cipher = o.extend({
								cfg: i.extend(),
								createEncryptor: function(t, e) {
									return this.create(this._ENC_XFORM_MODE, t, e)
								},
								createDecryptor: function(t, e) {
									return this.create(this._DEC_XFORM_MODE, t, e)
								},
								init: function(t, e, r) {
									this.cfg = this.cfg.extend(r), this._xformMode = t, this._key =
										e, this.reset()
								},
								reset: function() {
									o.reset.call(this), this._doReset()
								},
								process: function(t) {
									return this._append(t), this._process()
								},
								finalize: function(t) {
									return t && this._append(t), this._doFinalize()
								},
								keySize: 4,
								ivSize: 4,
								_ENC_XFORM_MODE: 1,
								_DEC_XFORM_MODE: 2,
								_createHelper: function() {
									function t(t) {
										return "string" == typeof t ? B : y
									}
									return function(e) {
										return {
											encrypt: function(r, i, n) {
												return t(i).encrypt(e, r, i, n)
											},
											decrypt: function(r, i, n) {
												return t(i).decrypt(e, r, i, n)
											}
										}
									}
								}()
							}),
							l = (r.StreamCipher = h.extend({
								_doFinalize: function() {
									return this._process(!0)
								},
								blockSize: 1
							}), e.mode = {}),
							f = r.BlockCipherMode = i.extend({
								createEncryptor: function(t, e) {
									return this.Encryptor.create(t, e)
								},
								createDecryptor: function(t, e) {
									return this.Decryptor.create(t, e)
								},
								init: function(t, e) {
									this._cipher = t, this._iv = e
								}
							}),
							u = l.CBC = function() {
								var t = f.extend();

								function e(t, e, r) {
									var i, n = this._iv;
									n ? (i = n, this._iv = undefined) : i = this._prevBlock;
									for (var o = 0; o < r; o++) t[e + o] ^= i[o]
								}
								return t.Encryptor = t.extend({
									processBlock: function(t, r) {
										var i = this._cipher,
											n = i.blockSize;
										e.call(this, t, r, n), i.encryptBlock(t, r), this
											._prevBlock = t.slice(r, r + n)
									}
								}), t.Decryptor = t.extend({
									processBlock: function(t, r) {
										var i = this._cipher,
											n = i.blockSize,
											o = t.slice(r, r + n);
										i.decryptBlock(t, r), e.call(this, t, r, n), this
											._prevBlock = o
									}
								}), t
							}(),
							p = (e.pad = {}).Pkcs7 = {
								pad: function(t, e) {
									for (var r = 4 * e, i = r - t.sigBytes % r, o = i << 24 | i << 16 |
											i << 8 | i, s = [], a = 0; a < i; a += 4) s.push(o);
									var c = n.create(s, i);
									t.concat(c)
								},
								unpad: function(t) {
									var e = 255 & t.words[t.sigBytes - 1 >>> 2];
									t.sigBytes -= e
								}
							},
							_ = (r.BlockCipher = h.extend({
								cfg: h.cfg.extend({
									mode: u,
									padding: p
								}),
								reset: function() {
									var t;
									h.reset.call(this);
									var e = this.cfg,
										r = e.iv,
										i = e.mode;
									this._xformMode == this._ENC_XFORM_MODE ? t = i
										.createEncryptor : (t = i.createDecryptor, this
											._minBufferSize = 1), this._mode && this._mode
										.__creator == t ? this._mode.init(this, r && r.words) :
										(this._mode = t.call(i, this, r && r.words), this._mode
											.__creator = t)
								},
								_doProcessBlock: function(t, e) {
									this._mode.processBlock(t, e)
								},
								_doFinalize: function() {
									var t, e = this.cfg.padding;
									return this._xformMode == this._ENC_XFORM_MODE ? (e.pad(this
										._data, this.blockSize), t = this._process(!0)) : (
										t = this._process(!0), e.unpad(t)), t
								},
								blockSize: 4
							}), r.CipherParams = i.extend({
								init: function(t) {
									this.mixIn(t)
								},
								toString: function(t) {
									return (t || this.formatter).stringify(this)
								}
							})),
							v = (e.format = {}).OpenSSL = {
								stringify: function(t) {
									var e = t.ciphertext,
										r = t.salt;
									return (r ? n.create([1398893684, 1701076831]).concat(r).concat(e) :
										e).toString(a)
								},
								parse: function(t) {
									var e, r = a.parse(t),
										i = r.words;
									return 1398893684 == i[0] && 1701076831 == i[1] && (e = n.create(i
										.slice(2, 4)), i.splice(0, 4), r.sigBytes -= 16), _.create({
										ciphertext: r,
										salt: e
									})
								}
							},
							y = r.SerializableCipher = i.extend({
								cfg: i.extend({
									format: v
								}),
								encrypt: function(t, e, r, i) {
									i = this.cfg.extend(i);
									var n = t.createEncryptor(r, i),
										o = n.finalize(e),
										s = n.cfg;
									return _.create({
										ciphertext: o,
										key: r,
										iv: s.iv,
										algorithm: t,
										mode: s.mode,
										padding: s.padding,
										blockSize: t.blockSize,
										formatter: i.format
									})
								},
								decrypt: function(t, e, r, i) {
									return i = this.cfg.extend(i), e = this._parse(e, i.format), t
										.createDecryptor(r, i).finalize(e.ciphertext)
								},
								_parse: function(t, e) {
									return "string" == typeof t ? e.parse(t, this) : t
								}
							}),
							g = (e.kdf = {}).OpenSSL = {
								execute: function(t, e, r, i) {
									i || (i = n.random(8));
									var o = c.create({
											keySize: e + r
										}).compute(t, i),
										s = n.create(o.words.slice(e), 4 * r);
									return o.sigBytes = 4 * e, _.create({
										key: o,
										iv: s,
										salt: i
									})
								}
							},
							B = r.PasswordBasedCipher = y.extend({
								cfg: y.cfg.extend({
									kdf: g
								}),
								encrypt: function(t, e, r, i) {
									var n = (i = this.cfg.extend(i)).kdf.execute(r, t.keySize, t
										.ivSize);
									i.iv = n.iv;
									var o = y.encrypt.call(this, t, e, n.key, i);
									return o.mixIn(n), o
								},
								decrypt: function(t, e, r, i) {
									i = this.cfg.extend(i), e = this._parse(e, i.format);
									var n = i.kdf.execute(r, t.keySize, t.ivSize, e.salt);
									return i.iv = n.iv, y.decrypt.call(this, t, e, n.key, i)
								}
							})
					}(), d.mode.CFB = function() {
						var t = d.lib.BlockCipherMode.extend();

						function e(t, e, r, i) {
							var n, o = this._iv;
							o ? (n = o.slice(0), this._iv = void 0) : n = this._prevBlock, i.encryptBlock(n,
								0);
							for (var s = 0; s < r; s++) t[e + s] ^= n[s]
						}
						return t.Encryptor = t.extend({
							processBlock: function(t, r) {
								var i = this._cipher,
									n = i.blockSize;
								e.call(this, t, r, n, i), this._prevBlock = t.slice(r, r + n)
							}
						}), t.Decryptor = t.extend({
							processBlock: function(t, r) {
								var i = this._cipher,
									n = i.blockSize,
									o = t.slice(r, r + n);
								e.call(this, t, r, n, i), this._prevBlock = o
							}
						}), t
					}(), d.mode.CTR = (o = (n = d.lib.BlockCipherMode.extend()).Encryptor = n.extend({
						processBlock: function(t, e) {
							var r = this._cipher,
								i = r.blockSize,
								n = this._iv,
								o = this._counter;
							n && (o = this._counter = n.slice(0), this._iv = void 0);
							var s = o.slice(0);
							r.encryptBlock(s, 0), o[i - 1] = o[i - 1] + 1 | 0;
							for (var a = 0; a < i; a++) t[e + a] ^= s[a]
						}
					}), n.Decryptor = o, n), d.mode.CTRGladman = function() {
						var t = d.lib.BlockCipherMode.extend();

						function e(t) {
							if (255 == (t >> 24 & 255)) {
								var e = t >> 16 & 255,
									r = t >> 8 & 255,
									i = 255 & t;
								255 === e ? (e = 0, 255 === r ? (r = 0, 255 === i ? i = 0 : ++i) : ++r) : ++
								e, t = 0, t += e << 16, t += r << 8, t += i
							} else t += 1 << 24;
							return t
						}
						var r = t.Encryptor = t.extend({
							processBlock: function(t, r) {
								var i = this._cipher,
									n = i.blockSize,
									o = this._iv,
									s = this._counter;
								o && (s = this._counter = o.slice(0), this._iv = void 0),
									function(t) {
										0 === (t[0] = e(t[0])) && (t[1] = e(t[1]))
									}(s);
								var a = s.slice(0);
								i.encryptBlock(a, 0);
								for (var c = 0; c < n; c++) t[r + c] ^= a[c]
							}
						});
						return t.Decryptor = r, t
					}(), d.mode.OFB = function() {
						var t = d.lib.BlockCipherMode.extend(),
							e = t.Encryptor = t.extend({
								processBlock: function(t, e) {
									var r = this._cipher,
										i = r.blockSize,
										n = this._iv,
										o = this._keystream;
									n && (o = this._keystream = n.slice(0), this._iv = void 0), r
										.encryptBlock(o, 0);
									for (var s = 0; s < i; s++) t[e + s] ^= o[s]
								}
							});
						return t.Decryptor = e, t
					}(), d.mode.ECB = ((i = d.lib.BlockCipherMode.extend()).Encryptor = i.extend({
						processBlock: function(t, e) {
							this._cipher.encryptBlock(t, e)
						}
					}), i.Decryptor = i.extend({
						processBlock: function(t, e) {
							this._cipher.decryptBlock(t, e)
						}
					}), i), d.pad.AnsiX923 = {
						pad: function(t, e) {
							var r = t.sigBytes,
								i = 4 * e,
								n = i - r % i,
								o = r + n - 1;
							t.clamp(), t.words[o >>> 2] |= n << 24 - o % 4 * 8, t.sigBytes += n
						},
						unpad: function(t) {
							var e = 255 & t.words[t.sigBytes - 1 >>> 2];
							t.sigBytes -= e
						}
					}, d.pad.Iso10126 = {
						pad: function(t, e) {
							var r = 4 * e,
								i = r - t.sigBytes % r;
							t.concat(d.lib.WordArray.random(i - 1)).concat(d.lib.WordArray.create([i <<
								24
							], 1))
						},
						unpad: function(t) {
							var e = 255 & t.words[t.sigBytes - 1 >>> 2];
							t.sigBytes -= e
						}
					}, d.pad.Iso97971 = {
						pad: function(t, e) {
							t.concat(d.lib.WordArray.create([2147483648], 1)), d.pad.ZeroPadding.pad(t,
								e)
						},
						unpad: function(t) {
							d.pad.ZeroPadding.unpad(t), t.sigBytes--
						}
					}, d.pad.ZeroPadding = {
						pad: function(t, e) {
							var r = 4 * e;
							t.clamp(), t.sigBytes += r - (t.sigBytes % r || r)
						},
						unpad: function(t) {
							var e = t.words,
								r = t.sigBytes - 1;
							for (r = t.sigBytes - 1; r >= 0; r--)
								if (e[r >>> 2] >>> 24 - r % 4 * 8 & 255) {
									t.sigBytes = r + 1;
									break
								}
						}
					}, d.pad.NoPadding = {
						pad: function() {},
						unpad: function() {}
					},
					function(t) {
						var e = d,
							r = e.lib.CipherParams,
							i = e.enc.Hex;
						e.format.Hex = {
							stringify: function(t) {
								return t.ciphertext.toString(i)
							},
							parse: function(t) {
								var e = i.parse(t);
								return r.create({
									ciphertext: e
								})
							}
						}
					}(),
					function() {
						var t = d,
							e = t.lib.BlockCipher,
							r = t.algo,
							i = [],
							n = [],
							o = [],
							s = [],
							a = [],
							c = [],
							h = [],
							l = [],
							f = [],
							u = [];
						! function() {
							for (var t = [], e = 0; e < 256; e++) t[e] = e < 128 ? e << 1 : e << 1 ^ 283;
							var r = 0,
								d = 0;
							for (e = 0; e < 256; e++) {
								var p = d ^ d << 1 ^ d << 2 ^ d << 3 ^ d << 4;
								p = p >>> 8 ^ 255 & p ^ 99, i[r] = p, n[p] = r;
								var _ = t[r],
									v = t[_],
									y = t[v],
									g = 257 * t[p] ^ 16843008 * p;
								o[r] = g << 24 | g >>> 8, s[r] = g << 16 | g >>> 16, a[r] = g << 8 | g >>>
									24, c[r] = g, g = 16843009 * y ^ 65537 * v ^ 257 * _ ^ 16843008 * r, h[
										p] = g << 24 | g >>> 8, l[p] = g << 16 | g >>> 16, f[p] = g << 8 |
									g >>> 24, u[p] = g, r ? (r = _ ^ t[t[t[y ^ _]]], d ^= t[t[d]]) : r = d =
									1
							}
						}();
						var p = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54],
							_ = r.AES = e.extend({
								_doReset: function() {
									if (!this._nRounds || this._keyPriorReset !== this._key) {
										for (var t = this._keyPriorReset = this._key, e = t.words,
												r = t.sigBytes / 4, n = 4 * ((this._nRounds = r +
													6) + 1), o = this._keySchedule = [], s = 0; s <
											n; s++) s < r ? o[s] = e[s] : (d = o[s - 1], s % r ? r >
											6 && s % r == 4 && (d = i[d >>> 24] << 24 | i[d >>>
												16 & 255] << 16 | i[d >>> 8 & 255] << 8 | i[
												255 & d]) : (d = i[(d = d << 8 | d >>> 24) >>>
												24] << 24 | i[d >>> 16 & 255] << 16 | i[
												d >>> 8 & 255] << 8 | i[255 & d], d ^= p[s /
												r | 0] << 24), o[s] = o[s - r] ^ d);
										for (var a = this._invKeySchedule = [], c = 0; c < n; c++) {
											if (s = n - c, c % 4) var d = o[s];
											else d = o[s - 4];
											a[c] = c < 4 || s <= 4 ? d : h[i[d >>> 24]] ^ l[i[d >>>
												16 & 255]] ^ f[i[d >>> 8 & 255]] ^ u[i[255 & d]]
										}
									}
								},
								encryptBlock: function(t, e) {
									this._doCryptBlock(t, e, this._keySchedule, o, s, a, c, i)
								},
								decryptBlock: function(t, e) {
									var r = t[e + 1];
									t[e + 1] = t[e + 3], t[e + 3] = r, this._doCryptBlock(t, e, this
										._invKeySchedule, h, l, f, u, n), r = t[e + 1], t[e +
										1] = t[e + 3], t[e + 3] = r
								},
								_doCryptBlock: function(t, e, r, i, n, o, s, a) {
									for (var c = this._nRounds, h = t[e] ^ r[0], l = t[e + 1] ^ r[
												1], f = t[e + 2] ^ r[2], u = t[e + 3] ^ r[3], d = 4,
											p =
											1; p < c; p++) {
										var _ = i[h >>> 24] ^ n[l >>> 16 & 255] ^ o[f >>> 8 & 255] ^
											s[255 & u] ^ r[d++],
											v = i[l >>> 24] ^ n[f >>> 16 & 255] ^ o[u >>> 8 & 255] ^
											s[255 & h] ^ r[d++],
											y = i[f >>> 24] ^ n[u >>> 16 & 255] ^ o[h >>> 8 & 255] ^
											s[255 & l] ^ r[d++],
											g = i[u >>> 24] ^ n[h >>> 16 & 255] ^ o[l >>> 8 & 255] ^
											s[255 & f] ^ r[d++];
										h = _, l = v, f = y, u = g
									}
									_ = (a[h >>> 24] << 24 | a[l >>> 16 & 255] << 16 | a[f >>> 8 &
										255] << 8 | a[255 & u]) ^ r[d++], v = (a[l >>> 24] <<
										24 | a[f >>> 16 & 255] << 16 | a[u >>> 8 & 255] << 8 |
										a[255 & h]) ^ r[d++], y = (a[f >>> 24] << 24 | a[u >>>
										16 & 255] << 16 | a[h >>> 8 & 255] << 8 | a[255 &
										l]) ^ r[d++], g = (a[u >>> 24] << 24 | a[h >>> 16 &
										255] << 16 | a[l >>> 8 & 255] << 8 | a[255 & f]) ^ r[
										d++], t[e] = _, t[e + 1] = v, t[e + 2] = y, t[e + 3] = g
								},
								keySize: 8
							});
						t.AES = e._createHelper(_)
					}(),
					function() {
						var t = d,
							e = t.lib,
							r = e.WordArray,
							i = e.BlockCipher,
							n = t.algo,
							o = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43,
								35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54,
								46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
							],
							s = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7,
								27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39,
								56, 34, 53, 46, 42, 50, 36, 29, 32
							],
							a = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],
							c = [{
								0: 8421888,
								268435456: 32768,
								536870912: 8421378,
								805306368: 2,
								1073741824: 512,
								1342177280: 8421890,
								1610612736: 8389122,
								1879048192: 8388608,
								2147483648: 514,
								2415919104: 8389120,
								2684354560: 33280,
								2952790016: 8421376,
								3221225472: 32770,
								3489660928: 8388610,
								3758096384: 0,
								4026531840: 33282,
								134217728: 0,
								402653184: 8421890,
								671088640: 33282,
								939524096: 32768,
								1207959552: 8421888,
								1476395008: 512,
								1744830464: 8421378,
								2013265920: 2,
								2281701376: 8389120,
								2550136832: 33280,
								2818572288: 8421376,
								3087007744: 8389122,
								3355443200: 8388610,
								3623878656: 32770,
								3892314112: 514,
								4160749568: 8388608,
								1: 32768,
								268435457: 2,
								536870913: 8421888,
								805306369: 8388608,
								1073741825: 8421378,
								1342177281: 33280,
								1610612737: 512,
								1879048193: 8389122,
								2147483649: 8421890,
								2415919105: 8421376,
								2684354561: 8388610,
								2952790017: 33282,
								3221225473: 514,
								3489660929: 8389120,
								3758096385: 32770,
								4026531841: 0,
								134217729: 8421890,
								402653185: 8421376,
								671088641: 8388608,
								939524097: 512,
								1207959553: 32768,
								1476395009: 8388610,
								1744830465: 2,
								2013265921: 33282,
								2281701377: 32770,
								2550136833: 8389122,
								2818572289: 514,
								3087007745: 8421888,
								3355443201: 8389120,
								3623878657: 0,
								3892314113: 33280,
								4160749569: 8421378
							}, {
								0: 1074282512,
								16777216: 16384,
								33554432: 524288,
								50331648: 1074266128,
								67108864: 1073741840,
								83886080: 1074282496,
								100663296: 1073758208,
								117440512: 16,
								134217728: 540672,
								150994944: 1073758224,
								167772160: 1073741824,
								184549376: 540688,
								201326592: 524304,
								218103808: 0,
								234881024: 16400,
								251658240: 1074266112,
								8388608: 1073758208,
								25165824: 540688,
								41943040: 16,
								58720256: 1073758224,
								75497472: 1074282512,
								92274688: 1073741824,
								109051904: 524288,
								125829120: 1074266128,
								142606336: 524304,
								159383552: 0,
								176160768: 16384,
								192937984: 1074266112,
								209715200: 1073741840,
								226492416: 540672,
								243269632: 1074282496,
								260046848: 16400,
								268435456: 0,
								285212672: 1074266128,
								301989888: 1073758224,
								318767104: 1074282496,
								335544320: 1074266112,
								352321536: 16,
								369098752: 540688,
								385875968: 16384,
								402653184: 16400,
								419430400: 524288,
								436207616: 524304,
								452984832: 1073741840,
								469762048: 540672,
								486539264: 1073758208,
								503316480: 1073741824,
								520093696: 1074282512,
								276824064: 540688,
								293601280: 524288,
								310378496: 1074266112,
								327155712: 16384,
								343932928: 1073758208,
								360710144: 1074282512,
								377487360: 16,
								394264576: 1073741824,
								411041792: 1074282496,
								427819008: 1073741840,
								444596224: 1073758224,
								461373440: 524304,
								478150656: 0,
								494927872: 16400,
								511705088: 1074266128,
								528482304: 540672
							}, {
								0: 260,
								1048576: 0,
								2097152: 67109120,
								3145728: 65796,
								4194304: 65540,
								5242880: 67108868,
								6291456: 67174660,
								7340032: 67174400,
								8388608: 67108864,
								9437184: 67174656,
								10485760: 65792,
								11534336: 67174404,
								12582912: 67109124,
								13631488: 65536,
								14680064: 4,
								15728640: 256,
								524288: 67174656,
								1572864: 67174404,
								2621440: 0,
								3670016: 67109120,
								4718592: 67108868,
								5767168: 65536,
								6815744: 65540,
								7864320: 260,
								8912896: 4,
								9961472: 256,
								11010048: 67174400,
								12058624: 65796,
								13107200: 65792,
								14155776: 67109124,
								15204352: 67174660,
								16252928: 67108864,
								16777216: 67174656,
								17825792: 65540,
								18874368: 65536,
								19922944: 67109120,
								20971520: 256,
								22020096: 67174660,
								23068672: 67108868,
								24117248: 0,
								25165824: 67109124,
								26214400: 67108864,
								27262976: 4,
								28311552: 65792,
								29360128: 67174400,
								30408704: 260,
								31457280: 65796,
								32505856: 67174404,
								17301504: 67108864,
								18350080: 260,
								19398656: 67174656,
								20447232: 0,
								21495808: 65540,
								22544384: 67109120,
								23592960: 256,
								24641536: 67174404,
								25690112: 65536,
								26738688: 67174660,
								27787264: 65796,
								28835840: 67108868,
								29884416: 67109124,
								30932992: 67174400,
								31981568: 4,
								33030144: 65792
							}, {
								0: 2151682048,
								65536: 2147487808,
								131072: 4198464,
								196608: 2151677952,
								262144: 0,
								327680: 4198400,
								393216: 2147483712,
								458752: 4194368,
								524288: 2147483648,
								589824: 4194304,
								655360: 64,
								720896: 2147487744,
								786432: 2151678016,
								851968: 4160,
								917504: 4096,
								983040: 2151682112,
								32768: 2147487808,
								98304: 64,
								163840: 2151678016,
								229376: 2147487744,
								294912: 4198400,
								360448: 2151682112,
								425984: 0,
								491520: 2151677952,
								557056: 4096,
								622592: 2151682048,
								688128: 4194304,
								753664: 4160,
								819200: 2147483648,
								884736: 4194368,
								950272: 4198464,
								1015808: 2147483712,
								1048576: 4194368,
								1114112: 4198400,
								1179648: 2147483712,
								1245184: 0,
								1310720: 4160,
								1376256: 2151678016,
								1441792: 2151682048,
								1507328: 2147487808,
								1572864: 2151682112,
								1638400: 2147483648,
								1703936: 2151677952,
								1769472: 4198464,
								1835008: 2147487744,
								1900544: 4194304,
								1966080: 64,
								2031616: 4096,
								1081344: 2151677952,
								1146880: 2151682112,
								1212416: 0,
								1277952: 4198400,
								1343488: 4194368,
								1409024: 2147483648,
								1474560: 2147487808,
								1540096: 64,
								1605632: 2147483712,
								1671168: 4096,
								1736704: 2147487744,
								1802240: 2151678016,
								1867776: 4160,
								1933312: 2151682048,
								1998848: 4194304,
								2064384: 4198464
							}, {
								0: 128,
								4096: 17039360,
								8192: 262144,
								12288: 536870912,
								16384: 537133184,
								20480: 16777344,
								24576: 553648256,
								28672: 262272,
								32768: 16777216,
								36864: 537133056,
								40960: 536871040,
								45056: 553910400,
								49152: 553910272,
								53248: 0,
								57344: 17039488,
								61440: 553648128,
								2048: 17039488,
								6144: 553648256,
								10240: 128,
								14336: 17039360,
								18432: 262144,
								22528: 537133184,
								26624: 553910272,
								30720: 536870912,
								34816: 537133056,
								38912: 0,
								43008: 553910400,
								47104: 16777344,
								51200: 536871040,
								55296: 553648128,
								59392: 16777216,
								63488: 262272,
								65536: 262144,
								69632: 128,
								73728: 536870912,
								77824: 553648256,
								81920: 16777344,
								86016: 553910272,
								90112: 537133184,
								94208: 16777216,
								98304: 553910400,
								102400: 553648128,
								106496: 17039360,
								110592: 537133056,
								114688: 262272,
								118784: 536871040,
								122880: 0,
								126976: 17039488,
								67584: 553648256,
								71680: 16777216,
								75776: 17039360,
								79872: 537133184,
								83968: 536870912,
								88064: 17039488,
								92160: 128,
								96256: 553910272,
								100352: 262272,
								104448: 553910400,
								108544: 0,
								112640: 553648128,
								116736: 16777344,
								120832: 262144,
								124928: 537133056,
								129024: 536871040
							}, {
								0: 268435464,
								256: 8192,
								512: 270532608,
								768: 270540808,
								1024: 268443648,
								1280: 2097152,
								1536: 2097160,
								1792: 268435456,
								2048: 0,
								2304: 268443656,
								2560: 2105344,
								2816: 8,
								3072: 270532616,
								3328: 2105352,
								3584: 8200,
								3840: 270540800,
								128: 270532608,
								384: 270540808,
								640: 8,
								896: 2097152,
								1152: 2105352,
								1408: 268435464,
								1664: 268443648,
								1920: 8200,
								2176: 2097160,
								2432: 8192,
								2688: 268443656,
								2944: 270532616,
								3200: 0,
								3456: 270540800,
								3712: 2105344,
								3968: 268435456,
								4096: 268443648,
								4352: 270532616,
								4608: 270540808,
								4864: 8200,
								5120: 2097152,
								5376: 268435456,
								5632: 268435464,
								5888: 2105344,
								6144: 2105352,
								6400: 0,
								6656: 8,
								6912: 270532608,
								7168: 8192,
								7424: 268443656,
								7680: 270540800,
								7936: 2097160,
								4224: 8,
								4480: 2105344,
								4736: 2097152,
								4992: 268435464,
								5248: 268443648,
								5504: 8200,
								5760: 270540808,
								6016: 270532608,
								6272: 270540800,
								6528: 270532616,
								6784: 8192,
								7040: 2105352,
								7296: 2097160,
								7552: 0,
								7808: 268435456,
								8064: 268443656
							}, {
								0: 1048576,
								16: 33555457,
								32: 1024,
								48: 1049601,
								64: 34604033,
								80: 0,
								96: 1,
								112: 34603009,
								128: 33555456,
								144: 1048577,
								160: 33554433,
								176: 34604032,
								192: 34603008,
								208: 1025,
								224: 1049600,
								240: 33554432,
								8: 34603009,
								24: 0,
								40: 33555457,
								56: 34604032,
								72: 1048576,
								88: 33554433,
								104: 33554432,
								120: 1025,
								136: 1049601,
								152: 33555456,
								168: 34603008,
								184: 1048577,
								200: 1024,
								216: 34604033,
								232: 1,
								248: 1049600,
								256: 33554432,
								272: 1048576,
								288: 33555457,
								304: 34603009,
								320: 1048577,
								336: 33555456,
								352: 34604032,
								368: 1049601,
								384: 1025,
								400: 34604033,
								416: 1049600,
								432: 1,
								448: 0,
								464: 34603008,
								480: 33554433,
								496: 1024,
								264: 1049600,
								280: 33555457,
								296: 34603009,
								312: 1,
								328: 33554432,
								344: 1048576,
								360: 1025,
								376: 34604032,
								392: 33554433,
								408: 34603008,
								424: 0,
								440: 34604033,
								456: 1049601,
								472: 1024,
								488: 33555456,
								504: 1048577
							}, {
								0: 134219808,
								1: 131072,
								2: 134217728,
								3: 32,
								4: 131104,
								5: 134350880,
								6: 134350848,
								7: 2048,
								8: 134348800,
								9: 134219776,
								10: 133120,
								11: 134348832,
								12: 2080,
								13: 0,
								14: 134217760,
								15: 133152,
								2147483648: 2048,
								2147483649: 134350880,
								2147483650: 134219808,
								2147483651: 134217728,
								2147483652: 134348800,
								2147483653: 133120,
								2147483654: 133152,
								2147483655: 32,
								2147483656: 134217760,
								2147483657: 2080,
								2147483658: 131104,
								2147483659: 134350848,
								2147483660: 0,
								2147483661: 134348832,
								2147483662: 134219776,
								2147483663: 131072,
								16: 133152,
								17: 134350848,
								18: 32,
								19: 2048,
								20: 134219776,
								21: 134217760,
								22: 134348832,
								23: 131072,
								24: 0,
								25: 131104,
								26: 134348800,
								27: 134219808,
								28: 134350880,
								29: 133120,
								30: 2080,
								31: 134217728,
								2147483664: 131072,
								2147483665: 2048,
								2147483666: 134348832,
								2147483667: 133152,
								2147483668: 32,
								2147483669: 134348800,
								2147483670: 134217728,
								2147483671: 134219808,
								2147483672: 134350880,
								2147483673: 134217760,
								2147483674: 134219776,
								2147483675: 0,
								2147483676: 133120,
								2147483677: 2080,
								2147483678: 131104,
								2147483679: 134350848
							}],
							h = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],
							l = n.DES = i.extend({
								_doReset: function() {
									for (var t = this._key.words, e = [], r = 0; r < 56; r++) {
										var i = o[r] - 1;
										e[r] = t[i >>> 5] >>> 31 - i % 32 & 1
									}
									for (var n = this._subKeys = [], c = 0; c < 16; c++) {
										var h = n[c] = [],
											l = a[c];
										for (r = 0; r < 24; r++) h[r / 6 | 0] |= e[(s[r] - 1 + l) %
											28] << 31 - r % 6, h[4 + (r / 6 | 0)] |= e[28 + (s[
											r + 24] - 1 + l) % 28] << 31 - r % 6;
										for (h[0] = h[0] << 1 | h[0] >>> 31, r = 1; r < 7; r++) h[
											r] = h[r] >>> 4 * (r - 1) + 3;
										h[7] = h[7] << 5 | h[7] >>> 27
									}
									var f = this._invSubKeys = [];
									for (r = 0; r < 16; r++) f[r] = n[15 - r]
								},
								encryptBlock: function(t, e) {
									this._doCryptBlock(t, e, this._subKeys)
								},
								decryptBlock: function(t, e) {
									this._doCryptBlock(t, e, this._invSubKeys)
								},
								_doCryptBlock: function(t, e, r) {
									this._lBlock = t[e], this._rBlock = t[e + 1], f.call(this, 4,
										252645135), f.call(this, 16, 65535), u.call(this, 2,
										858993459), u.call(this, 8, 16711935), f.call(this, 1,
										1431655765);
									for (var i = 0; i < 16; i++) {
										for (var n = r[i], o = this._lBlock, s = this._rBlock, a =
												0, l = 0; l < 8; l++) a |= c[l][((s ^ n[l]) & h[
											l]) >>> 0];
										this._lBlock = s, this._rBlock = o ^ a
									}
									var d = this._lBlock;
									this._lBlock = this._rBlock, this._rBlock = d, f.call(this, 1,
										1431655765), u.call(this, 8, 16711935), u.call(this, 2,
										858993459), f.call(this, 16, 65535), f.call(this, 4,
										252645135), t[e] = this._lBlock, t[e + 1] = this._rBlock
								},
								keySize: 2,
								ivSize: 2,
								blockSize: 2
							});

						function f(t, e) {
							var r = (this._lBlock >>> t ^ this._rBlock) & e;
							this._rBlock ^= r, this._lBlock ^= r << t
						}

						function u(t, e) {
							var r = (this._rBlock >>> t ^ this._lBlock) & e;
							this._lBlock ^= r, this._rBlock ^= r << t
						}
						t.DES = i._createHelper(l);
						var p = n.TripleDES = i.extend({
							_doReset: function() {
								var t = this._key.words;
								if (2 !== t.length && 4 !== t.length && t.length < 6)
									throw new Error(
										"Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192."
									);
								var e = t.slice(0, 2),
									i = t.length < 4 ? t.slice(0, 2) : t.slice(2, 4),
									n = t.length < 6 ? t.slice(0, 2) : t.slice(4, 6);
								this._des1 = l.createEncryptor(r.create(e)), this._des2 = l
									.createEncryptor(r.create(i)), this._des3 = l
									.createEncryptor(r.create(n))
							},
							encryptBlock: function(t, e) {
								this._des1.encryptBlock(t, e), this._des2.decryptBlock(t, e),
									this._des3.encryptBlock(t, e)
							},
							decryptBlock: function(t, e) {
								this._des3.decryptBlock(t, e), this._des2.encryptBlock(t, e),
									this._des1.decryptBlock(t, e)
							},
							keySize: 6,
							ivSize: 2,
							blockSize: 2
						});
						t.TripleDES = i._createHelper(p)
					}(),
					function() {
						var t = d,
							e = t.lib.StreamCipher,
							r = t.algo,
							i = r.RC4 = e.extend({
								_doReset: function() {
									for (var t = this._key, e = t.words, r = t.sigBytes, i = this
											._S = [], n = 0; n < 256; n++) i[n] = n;
									n = 0;
									for (var o = 0; n < 256; n++) {
										var s = n % r,
											a = e[s >>> 2] >>> 24 - s % 4 * 8 & 255;
										o = (o + i[n] + a) % 256;
										var c = i[n];
										i[n] = i[o], i[o] = c
									}
									this._i = this._j = 0
								},
								_doProcessBlock: function(t, e) {
									t[e] ^= n.call(this)
								},
								keySize: 8,
								ivSize: 0
							});

						function n() {
							for (var t = this._S, e = this._i, r = this._j, i = 0, n = 0; n < 4; n++) {
								r = (r + t[e = (e + 1) % 256]) % 256;
								var o = t[e];
								t[e] = t[r], t[r] = o, i |= t[(t[e] + t[r]) % 256] << 24 - 8 * n
							}
							return this._i = e, this._j = r, i
						}
						t.RC4 = e._createHelper(i);
						var o = r.RC4Drop = i.extend({
							cfg: i.cfg.extend({
								drop: 192
							}),
							_doReset: function() {
								i._doReset.call(this);
								for (var t = this.cfg.drop; t > 0; t--) n.call(this)
							}
						});
						t.RC4Drop = e._createHelper(o)
					}(),
					function() {
						var t = d,
							e = t.lib.StreamCipher,
							r = t.algo,
							i = [],
							n = [],
							o = [],
							s = r.Rabbit = e.extend({
								_doReset: function() {
									for (var t = this._key.words, e = this.cfg.iv, r = 0; r <
										4; r++) t[r] = 16711935 & (t[r] << 8 | t[r] >>> 24) |
										4278255360 & (t[r] << 24 | t[r] >>> 8);
									var i = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] <<
											16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3],
											t[2] << 16 | t[1] >>> 16
										],
										n = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] |
											65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[
												1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16,
											4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>>
											16, 4294901760 & t[3] | 65535 & t[0]
										];
									for (this._b = 0, r = 0; r < 4; r++) a.call(this);
									for (r = 0; r < 8; r++) n[r] ^= i[r + 4 & 7];
									if (e) {
										var o = e.words,
											s = o[0],
											c = o[1],
											h = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s <<
												24 | s >>> 8),
											l = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c <<
												24 | c >>> 8),
											f = h >>> 16 | 4294901760 & l,
											u = l << 16 | 65535 & h;
										for (n[0] ^= h, n[1] ^= f, n[2] ^= l, n[3] ^= u, n[4] ^= h,
											n[5] ^= f, n[6] ^= l, n[7] ^= u, r = 0; r < 4; r++) a
											.call(this)
									}
								},
								_doProcessBlock: function(t, e) {
									var r = this._X;
									a.call(this), i[0] = r[0] ^ r[5] >>> 16 ^ r[3] << 16, i[1] = r[
											2] ^ r[7] >>> 16 ^ r[5] << 16, i[2] = r[4] ^ r[1] >>>
										16 ^ r[7] << 16, i[3] = r[6] ^ r[3] >>> 16 ^ r[1] << 16;
									for (var n = 0; n < 4; n++) i[n] = 16711935 & (i[n] << 8 | i[
										n] >>> 24) | 4278255360 & (i[n] << 24 | i[n] >>> 8), t[
										e + n] ^= i[n]
								},
								blockSize: 4,
								ivSize: 2
							});

						function a() {
							for (var t = this._X, e = this._C, r = 0; r < 8; r++) n[r] = e[r];
							for (e[0] = e[0] + 1295307597 + this._b | 0, e[1] = e[1] + 3545052371 + (e[
									0] >>> 0 < n[0] >>> 0 ? 1 : 0) | 0, e[2] = e[2] + 886263092 + (e[1] >>>
									0 < n[1] >>> 0 ? 1 : 0) | 0, e[3] = e[3] + 1295307597 + (e[2] >>> 0 < n[
									2] >>> 0 ? 1 : 0) | 0, e[4] = e[4] + 3545052371 + (e[3] >>> 0 < n[3] >>>
									0 ? 1 : 0) | 0, e[5] = e[5] + 886263092 + (e[4] >>> 0 < n[4] >>> 0 ? 1 :
									0) | 0, e[6] = e[6] + 1295307597 + (e[5] >>> 0 < n[5] >>> 0 ? 1 : 0) |
								0, e[7] = e[7] + 3545052371 + (e[6] >>> 0 < n[6] >>> 0 ? 1 : 0) | 0, this
								._b = e[7] >>> 0 < n[7] >>> 0 ? 1 : 0, r = 0; r < 8; r++) {
								var i = t[r] + e[r],
									s = 65535 & i,
									a = i >>> 16,
									c = ((s * s >>> 17) + s * a >>> 15) + a * a,
									h = ((4294901760 & i) * i | 0) + ((65535 & i) * i | 0);
								o[r] = c ^ h
							}
							t[0] = o[0] + (o[7] << 16 | o[7] >>> 16) + (o[6] << 16 | o[6] >>> 16) | 0, t[
									1] = o[1] + (o[0] << 8 | o[0] >>> 24) + o[7] | 0, t[2] = o[2] + (o[1] <<
									16 | o[1] >>> 16) + (o[0] << 16 | o[0] >>> 16) | 0, t[3] = o[3] + (o[
									2] << 8 | o[2] >>> 24) + o[1] | 0, t[4] = o[4] + (o[3] << 16 | o[3] >>>
									16) + (o[2] << 16 | o[2] >>> 16) | 0, t[5] = o[5] + (o[4] << 8 | o[
									4] >>> 24) + o[3] | 0, t[6] = o[6] + (o[5] << 16 | o[5] >>> 16) + (o[
									4] << 16 | o[4] >>> 16) | 0, t[7] = o[7] + (o[6] << 8 | o[6] >>> 24) +
								o[5] | 0
						}
						t.Rabbit = e._createHelper(s)
					}(),
					function() {
						var t = d,
							e = t.lib.StreamCipher,
							r = t.algo,
							i = [],
							n = [],
							o = [],
							s = r.RabbitLegacy = e.extend({
								_doReset: function() {
									var t = this._key.words,
										e = this.cfg.iv,
										r = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] <<
											16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3],
											t[2] << 16 | t[1] >>> 16
										],
										i = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] |
											65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[
												1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16,
											4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>>
											16, 4294901760 & t[3] | 65535 & t[0]
										];
									this._b = 0;
									for (var n = 0; n < 4; n++) a.call(this);
									for (n = 0; n < 8; n++) i[n] ^= r[n + 4 & 7];
									if (e) {
										var o = e.words,
											s = o[0],
											c = o[1],
											h = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s <<
												24 | s >>> 8),
											l = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c <<
												24 | c >>> 8),
											f = h >>> 16 | 4294901760 & l,
											u = l << 16 | 65535 & h;
										for (i[0] ^= h, i[1] ^= f, i[2] ^= l, i[3] ^= u, i[4] ^= h,
											i[5] ^= f, i[6] ^= l, i[7] ^= u, n = 0; n < 4; n++) a
											.call(this)
									}
								},
								_doProcessBlock: function(t, e) {
									var r = this._X;
									a.call(this), i[0] = r[0] ^ r[5] >>> 16 ^ r[3] << 16, i[1] = r[
											2] ^ r[7] >>> 16 ^ r[5] << 16, i[2] = r[4] ^ r[1] >>>
										16 ^ r[7] << 16, i[3] = r[6] ^ r[3] >>> 16 ^ r[1] << 16;
									for (var n = 0; n < 4; n++) i[n] = 16711935 & (i[n] << 8 | i[
										n] >>> 24) | 4278255360 & (i[n] << 24 | i[n] >>> 8), t[
										e + n] ^= i[n]
								},
								blockSize: 4,
								ivSize: 2
							});

						function a() {
							for (var t = this._X, e = this._C, r = 0; r < 8; r++) n[r] = e[r];
							for (e[0] = e[0] + 1295307597 + this._b | 0, e[1] = e[1] + 3545052371 + (e[
									0] >>> 0 < n[0] >>> 0 ? 1 : 0) | 0, e[2] = e[2] + 886263092 + (e[1] >>>
									0 < n[1] >>> 0 ? 1 : 0) | 0, e[3] = e[3] + 1295307597 + (e[2] >>> 0 < n[
									2] >>> 0 ? 1 : 0) | 0, e[4] = e[4] + 3545052371 + (e[3] >>> 0 < n[3] >>>
									0 ? 1 : 0) | 0, e[5] = e[5] + 886263092 + (e[4] >>> 0 < n[4] >>> 0 ? 1 :
									0) | 0, e[6] = e[6] + 1295307597 + (e[5] >>> 0 < n[5] >>> 0 ? 1 : 0) |
								0, e[7] = e[7] + 3545052371 + (e[6] >>> 0 < n[6] >>> 0 ? 1 : 0) | 0, this
								._b = e[7] >>> 0 < n[7] >>> 0 ? 1 : 0, r = 0; r < 8; r++) {
								var i = t[r] + e[r],
									s = 65535 & i,
									a = i >>> 16,
									c = ((s * s >>> 17) + s * a >>> 15) + a * a,
									h = ((4294901760 & i) * i | 0) + ((65535 & i) * i | 0);
								o[r] = c ^ h
							}
							t[0] = o[0] + (o[7] << 16 | o[7] >>> 16) + (o[6] << 16 | o[6] >>> 16) | 0, t[
									1] = o[1] + (o[0] << 8 | o[0] >>> 24) + o[7] | 0, t[2] = o[2] + (o[1] <<
									16 | o[1] >>> 16) + (o[0] << 16 | o[0] >>> 16) | 0, t[3] = o[3] + (o[
									2] << 8 | o[2] >>> 24) + o[1] | 0, t[4] = o[4] + (o[3] << 16 | o[3] >>>
									16) + (o[2] << 16 | o[2] >>> 16) | 0, t[5] = o[5] + (o[4] << 8 | o[
									4] >>> 24) + o[3] | 0, t[6] = o[6] + (o[5] << 16 | o[5] >>> 16) + (o[
									4] << 16 | o[4] >>> 16) | 0, t[7] = o[7] + (o[6] << 8 | o[6] >>> 24) +
								o[5] | 0
						}
						t.RabbitLegacy = e._createHelper(s)
					}(), d)
			},
			480: () => {}
		},
		e = {};

	function r(i) {
		var n = e[i];
		if (void 0 !== n) return n.exports;
		var o = e[i] = {
			exports: {}
		};
		return t[i].call(o.exports, o, o.exports, r), o.exports
	}
	r.g = function() {
		if ("object" == typeof globalThis) return globalThis;
		try {
			return this || new Function("return this")()
		} catch (t) {
			if ("object" == typeof window) return window
		}
	}();
	var i = r(239);
	CryptoJS = i
})();

//**【框架统一配置项】====================================================================================================【复制模版时将下方到结尾的代码全部复制自己的代码块即可，然后入口编写main函数】
let actionflow_name = context.getArg("actionflow_name") || ""; //调用actionflow表中的哪个自定义行为
let attach_data = {}; // actionflow表attach_data附加信息
let system = {}; // system表关键数据
let payload = context.getArg("payload") || {}; // 在自定义行为配置payload入参

let errlog_title = typeof actionflow_name !== "undefined" ? actionflow_name : "系统_自定义行为框架"; //errlog表的title,错误日志记录使用
let debug = false; // 调试模式下不会记录日志，正式上线时请将调试模式关闭
let is_multi_app = false; //是否开启多应用,默认关闭，system表如果有多条数据时才使用
let default_system_system = null; //默认的多应用id,system数据表id,根据system_id传入后自动进行重置
let system_model_list = ["user"]; //多应用对哪些数据表过滤，默认过滤user表

try {
	setReturn(main(typeof payload === "undefined" ? undefined : payload));
} catch (res) {
	setReturn(res, undefined, undefined, true);
}

//**【框架功能函数】====================================================================================================【相关功能函数】
// 调用自定义行为
function callActionflow(args = {}, actionflow_id = undefined) {
	if (!actionflow_id) {
		actionflow_id = system?.actionflow_config?.actionflow_id;
		if (payload?.token && !args?.payload?.token) {
			if (args?.payload && typeof args?.payload == "object") {
				args.payload.token = payload?.token;
			} else if (!args?.payload) {
				args.payload = {
					token: payload.token
				}
			}
		}
	}
	return context.callActionFlow(actionflow_id, null, args);
}
// 调用zion配置的第三方api
function callThirdapi(queryData = {}, mode = 3) {
	let {
		thirdapi_name,
		model,
		fz_body,
		params,
		isMerge = false,
		field_string
	} = queryData
	if (!thirdapi_name) {
		return setReturn(queryData, "失败", `thirdapi_name:${thirdapi_name},不能为空`);
	}
	if (model) {
		return query({
			model: model,
			field_string: field_string || "field_400_json field_500_json responseCode",
			...(fz_body !== undefined ? {
				fz_body
			} : {}),
			...(params ? {
				params
			} : {}),
		}, mode)
	} else {
		// 查询接口名称
		let [thirdapi] = query({
			model: "thirdapi",
			field_string: `id name operation_id request_url default_params default_fz_body method`,
			limit: 1,
			where: {
				name: {
					_eq: thirdapi_name
				}
			}
		})
		if (!thirdapi?.operation_id) {
			throw {
				status: "失败",
				msg: `不存在的thirdapi或未设置operation_id:${thirdapi_name}`,
				data: {
					queryData,
					thirdapi_name,
					thirdapi
				}
			}
		}
		if (isMerge) {
			let tmp_fz_body = (typeof thirdapi?.default_fz_body == "object" ? thirdapi?.default_fz_body : null);
			if (typeof fz_body == "object" && tmp_fz_body) {
				fz_body = deepMerge(tmp_fz_body, fz_body || {});
			}

			let tmp_params = (typeof thirdapi?.default_params == "object" ? thirdapi?.default_params : null);
			if (typeof params == "object" && tmp_params) {
				params = deepMerge(tmp_params, params || {});
			}
		}
		return query({
			model: `operation_${thirdapi.operation_id}`,
			field_string: field_string || "field_400_json field_500_json responseCode",
			...(fz_body !== undefined ? {
				fz_body
			} : {}),
			...(params ? {
				params
			} : {}),
		}, mode)
	}
}

// 响应mutation
function responseMutation(mutation_config) {
	let mutation_result = {};
	let model;
	if (Object.keys(mutation_config).length <= 0) {
		return setReturn(mutation_config, "失败", "responseMutation配置有误");
	}
	if (Array.isArray(mutation_config)) {
		// 批量请求
		mutation_result = batch_mutation(mutation_config);
	} else {

		// 单条请求
		model = mutation_config.operation.slice(7);
		mutation_result[mutation_config.operation] = mutation(mutation_config);
	}

	let affected_rows = 0;
	let model_lists = [];
	for (let key in mutation_result) {
		let {
			returning: model_lists_tmp = [],
			affected_rows: affected_rows_tmp = 0
		} = mutation_result[key] || {};
		affected_rows += affected_rows_tmp;
		model_lists_tmp.forEach(item => {
			model_lists.push({
				operation: key,
				affected_rows: affected_rows_tmp,
				...item,
			})
		})
	}
	return {
		affected_rows,
		model,
		model_data: model_lists?.[0],
		model_lists,
	};
}
// 响应query
function responseQuery(query_config = {}) {
	let args_location = query_config?.args?.location;
	let {
		model,
		aggregate_field_string,
		...other_data
	} = query_config;
	let use_model = args_location ? `fz_${model}_by_location` : model;
	let query_lists = [{
		model: use_model,
		...other_data
	}];
	if (aggregate_field_string) {
		query_lists.push({
			model: `${model}_aggregate`,
			where: other_data?.where,
			field_string: `aggregate{ ${aggregate_field_string} }`
		})
	}
	let query_result = batch_query(query_lists);
	let {
		[use_model]: model_lists = [],
			[model + "_aggregate"]: model_aggregate = {},
	} = query_result
	return {
		model,
		model_data: model_lists?.[0],
		model_aggregate,
		model_lists
	}
}

// 设置返回结果
function setReturn(res, res_status = "成功", res_msg = undefined, is_last_res = false) {
	if (!is_last_res) {
		throw {
			status: res_status,
			msg: res_msg,
			data: res
		}
	}
	let result = res;
	if (typeof result != "object") {
		result = {
			status: "失败",
			msg: result
		}
	}
	let {
		status = "失败", msg = undefined, data = undefined
	} = result
	let is_debug = (typeof debug == "undefined" || debug) ? true : false
	if (status != "成功") {
		// 生产模式下需要记录日志
		if (!is_debug) {
			try {
				let title = (typeof errlog_title != "undefined" ? errlog_title : "");
				errlog(result, `setReturn记录_${title}`);
			} catch (err) {
				if (!data) {
					data = {
						errlog: err
					}
				} else if (typeof data === "object") {
					data.errlog = err
				}
			}
		}
	};
	//下方开始设置固定返回数据
	context.setReturn("status", status);
	context.setReturn("msg", msg);
	context.setReturn("data", data);
}
// 执行自定义行为
function runGqlImp(operationName, gql, variables = {}) {
	let runGqlImpRes;
	try {
		runGqlImpRes = context.runGql(operationName, gql, variables, {
			role: 'admin'
		});
	} catch (error) {
		throw {
			status: "gql错误",
			msg: `operationName：【${operationName}】，gql:=>【${gql}】<=执行有误`,
			data: {
				operationName,
				gql,
				variables,
				error
			}
		}
	}
	if (operationName.slice(0, 5) == "batch") {
		return runGqlImpRes;
	} else {
		return runGqlImpRes.response;
	}
}
// 日志记录
function errlog(error, title = "未定义错误") {
	let content;
	let attach_data = {};
	if (typeof error == "string") {
		content = error
	} else if (typeof error == "object") {
		attach_data = error;
		content = JSON.stringify(error);
	} else {
		content = "error类型有误、既不是string也不是object";
	}

	let gql = `mutation insert_errlog($title:String!,$content:String!,$attach_data:jsonb){
    response:insert_errlog_one(object:{
      title:$title
      content:$content
	  attach_data:$attach_data
    }){
      id
    }
  }`
	return runGqlImp("insert_errlog", gql, {
		title,
		content
	})
}
// mode=1,仅仅将对象的键的引号替换掉，mode=2，将键和值的引号全部替换掉,默认为模式1，mode=3在遇到某些特定字段时会做相应规则处理
function gql_string(obj, mode = 1) {
	if (mode === 1) {
		return JSON.stringify(obj).replace(/"(\w+?)":/g, "$1:");
	} else if (mode === 2) {
		return JSON.stringify(obj).replace(/"/g, "");
	} else if (mode === 3) {
		return JSON.stringify(obj).replace(/"(\w+?)":/g, "$1:").replace(
			/([,\{])update_columns:"([\w,\[\]]+)"([,\}])/g, "$1update_columns:$2$3").replace(
			/([,\{])constraint:"([\w,\[\]]+)"([,\}])/g, "$1constraint:$2$3");
	} else if (mode === 4) {
		return obj.replace(/\\/g, "\\\\").replace(/\r\n/g, "\\n").replace(/\"/g, "\\\"").replace(/\n/g, "\\n");
	}
}
// 封装的更新操作，可以直接使用无需在写gql
function mutation(data = {}, mode = 3, response_key = "response") {
	let {
		operation = "", field_string = ``, where = {}, _set, _inc, objects = [], on_conflict,
			args = {}, object, pk_columns, params,
			id,
	} = data
	let response_body = ``;
	let gql = ``;
	let op_type = operation.slice(0, 6);
	if (op_type != "update" && op_type != "delete" && op_type != "insert" && op_type != "umedia" && op_type !=
		"action" && op_type != "others") {
		throw "operation不正确，可选值：1.update 2.delete 3.insert 4.umedia 5.action 6.others"
	};
	if (op_type == "others") {
		let model = operation.slice(7);
		let params_string = ""
		if (typeof params == "object" && params && Object.keys(params).length > 0) {
			let tempStr = gql_string(params)
			params_string = `${tempStr.slice(1, tempStr.length - 1)}`;
		}
		let queryResponse = "";
		if (field_string) {
			queryResponse = ` {
			  ${field_string}
			}`;
		}
		let queryBody = "";
		if (params_string) {
			queryBody = `(${params_string})`
		}
		response_body = `${response_key}:${model}${queryBody}${queryResponse}`;
		gql = `mutation fz_others { ${response_body} }`;
		return mode === 1 ? gql : (mode === 2 ? response_body : runGqlImp("fz_others", gql));
	}
	if (op_type == "action") {
		let actionflow_id = operation.slice(7);
		if (!actionflow_id) {
			throw "actionflow_id不能为空";
		};
		let args_string = `${gql_string(args||{})}`;
		response_body =
			`${response_key}: fz_invoke_action_code(testPassword:"doushizhutou3" args:{actionflow_id: "${actionflow_id}",actionflow_data: ${args_string}} jsCode:"const actionflow_data = context.getArg(\\"actionflow_data\\") || {};const actionflow_id = context.getArg(\\"actionflow_id\\") || \\"\\";let action_result = context.callActionFlow(actionflow_id, null, actionflow_data);context.setReturn(\\"action_result\\", action_result);" updateDb:true accountId:1000000000000001)`;
		gql = `mutation fz_action { ${response_body} }`;
		return mode === 1 ? gql : (mode === 2 ? response_body : runGqlImp("fz_action", gql)?.action_result);
	};
	if (op_type == "umedia") {
		let media_url = operation.slice(7);
		if (!media_url) {
			throw "media_url不能为空，请传入需要上传的图片或文件链接"
		};
		response_body =
			`${response_key}: fz_invoke_action_code(testPassword:"doushizhutou3" args:{media_url:"${media_url}"} jsCode:"const media_url = context.getArg(\\"media_url\\") || \\"\\";let umedia_result = context.uploadMedia(media_url, {});context.setReturn(\\"umedia_result\\", umedia_result);" updateDb:true accountId:1000000000000001)`
		gql = `mutation fz_umedia { ${response_body} }`;
		return mode === 1 ? gql : (mode === 2 ? response_body : runGqlImp("fz_umedia", gql)?.umedia_result);
	};
	if (op_type == "insert" || op_type == "update") {
		let is_multi_app_tmp = typeof is_multi_app !== "undefined" ? is_multi_app : false;
		let default_system_system_tmp = typeof default_system_system !== "undefined" ? default_system_system : null;
		let system_model_list_tmp = typeof system_model_list !== "undefined" ? system_model_list : [];
		let model = operation.slice(7);
		system_model_list_tmp.forEach(item => {
			let reg = new RegExp(`^${item}`)
			if (reg.test(model) && is_multi_app_tmp) {
				if (!where?.system_system) {
					where.system_system = {
						_eq: default_system_system_tmp
					}
				}
				objects.forEach(itemObject => {
					if (!itemObject?.system_system) {
						itemObject.system_system = default_system_system_tmp
					}
				})
				if (!object?.system_system) {
					object.system_system = default_system_system_tmp
				}
			}
		})
	}
	let where_string = "";
	if (typeof where == "object" && where && Object.keys(where).length > 0) {
		where_string = `where:${gql_string(where)}`
	};

	let _set_string = "";
	if (typeof _set == "object" && _set && Object.keys(_set).length > 0) {
		_set_string = `_set:${gql_string(_set)}`
	};

	let _inc_string = "";
	if (typeof _inc == "object" && _inc && Object.keys(_inc).length > 0) {
		_inc_string = `_inc:${gql_string(_inc)}`
	};

	let objects_string = "";
	if (typeof objects == "object" && objects && Object.keys(objects).length > 0) {
		objects_string = `objects:${gql_string(objects, 3)}`
	};

	let on_conflict_string = "";
	if (typeof on_conflict == "object" && on_conflict && Object.keys(on_conflict).length > 0) {
		on_conflict_string = `on_conflict:${gql_string(on_conflict, 3)}`
	};

	let object_string = ""
	if (typeof object == "object" && object && Object.keys(object).length > 0) {
		object_string = `object:${gql_string(object, 3)}`
	}

	let pk_columns_string = ""
	if (typeof pk_columns == "object" && pk_columns && Object.keys(pk_columns).length > 0) {
		pk_columns_string = `pk_columns:${gql_string(pk_columns)}`
	}

	let id_string = ""
	if (typeof id != "undefined") {
		id_string = `id:${id}`
	}

	let responseBodyAutoAttach = "id"
	if (/insert_\w+_one/.test(operation)) {
		response_body = `${response_key}:${operation}(
			  ${object_string}
			  ${on_conflict_string}
			) {
			    ${responseBodyAutoAttach}
			    ${field_string}
			}`
	} else if (/update_\w+_by_pk/.test(operation)) {
		response_body = `${response_key}:${operation}(
			  ${_set_string}
			  ${_inc_string}
			   ${pk_columns_string}
			) {
			    ${responseBodyAutoAttach}
			    ${field_string}
			}`
	} else if (/delete_\w+_by_pk/.test(operation)) {
		response_body = `${response_key}:${operation}(
			  ${id_string}
			) {
			    ${responseBodyAutoAttach}
			    ${field_string}
			}`
	} else {
		response_body = `${response_key}:${operation}(
			  ${where_string}
			  ${_set_string}
			  ${_inc_string}
			  ${objects_string}
			  ${on_conflict_string}
			) {
			  affected_rows
			  returning{
			    ${responseBodyAutoAttach}
			    ${field_string}
			  }
			}`
	}
	gql = `mutation ${operation} {
	  ${response_body}
	}`
	return mode === 1 ? gql : (mode === 2 ? response_body : runGqlImp(operation, gql));
}
// 封装的查询操作，可以直接使用无需再写gql
function query(data = {}, mode = 3, response_key = "response") {
	let {
		model = "account", field_string = ``, where = {}, order_by, distinct_on, offset, limit,
			id,
			fz_body, params,
			args
	} = data
	let response_body = ``;
	let gql = ``;

	let is_multi_app_tmp = typeof is_multi_app !== "undefined" ? is_multi_app : false;
	let default_system_system_tmp = typeof default_system_system !== "undefined" ? default_system_system : null;
	let system_model_list_tmp = typeof system_model_list !== "undefined" ? system_model_list : [];
	system_model_list_tmp.forEach(item => {
		let reg = new RegExp(`^${item}`)
		if (reg.test(model) && is_multi_app_tmp) {
			if (!where?.system_system) {
				where.system_system = {
					_eq: default_system_system_tmp
				}
			}
		}
	});

	let args_string = "";
	if (typeof args == "object" && args && Object.keys(args).length > 0) {
		args_string = `args:${gql_string(args)}`;
	}
	let where_string = "";
	if (typeof where == "object" && where && Object.keys(where).length > 0) {
		where_string = `where:${gql_string(where)}`;
	};
	let order_by_string = "";
	if (typeof order_by == "object" && order_by && Object.keys(order_by).length > 0) {
		order_by_string = `order_by:${gql_string(order_by, 2)}`;
	};
	let distinct_on_string = "";
	if (typeof distinct_on == "string" && distinct_on) {
		distinct_on_string = `distinct_on:${distinct_on}`;
	};
	let offset_string = "";
	if (typeof offset == "number" && offset > 0) {
		offset_string = `offset:${offset}`;
	};
	let limit_string = "";
	if (typeof limit == "number" && limit > 0) {
		limit_string = `limit:${limit}`;
	}
	let fz_body_string = ""
	if (typeof fz_body !== "undefined") {
		if (typeof fz_body == "object" && fz_body) {
			fz_body_string = `fz_body:${gql_string(fz_body)}`;
		} else {
			fz_body_string = `fz_body:"${gql_string(fz_body,4)}"`;
		}
	}
	let params_string = ""
	if (typeof params == "object" && params && Object.keys(params).length > 0) {
		let tempStr = gql_string(params)
		params_string = `${tempStr.slice(1, tempStr.length - 1)}`;
	}

	let queryBody = "";
	let responseBodyAutoAttach = ""
	if (/operation_\w+/.test(model)) {
		if (params_string || fz_body_string) {
			queryBody = `(
			  ${params_string}
			  ${fz_body_string}
			) `
		}
	} else if (/\w+_by_pk/.test(model)) {
		if (typeof id != "undefined") {
			queryBody = `(
			  id:${id}
			) `
		}
	} else if (params_string) {
		queryBody = `(
		  ${params_string}
		) `
	} else {
		if (/\w+_aggregate/.test(model)) {
			responseBodyAutoAttach = ""
		} else {
			responseBodyAutoAttach = "id"
		}
		if (where_string || order_by_string || distinct_on_string || offset_string || limit_string || args_string) {
			queryBody = `(
			      ${where_string}
			      ${order_by_string}
			      ${distinct_on_string}
			      ${offset_string}
			      ${limit_string}
				  ${args_string}
			    ) `
		}
	}
	let queryResponse = "";
	if (field_string || responseBodyAutoAttach) {
		queryResponse = `{
			${responseBodyAutoAttach}
			${field_string}
		  }`;
	}
	response_body = `${response_key}: ${model} ${queryBody}${queryResponse}`
	gql = `query ${model} {
    ${response_body}
  }`
	return mode === 1 ? gql : (mode === 2 ? response_body : runGqlImp(model, gql));
}

// 封装的批量修改的操作
function batch_mutation(list = [], mode = 3) {
	let response_body = ``;
	let gql = ``;
	list.forEach(item => {
		let response_key = item?.response_key || (item?.operation.replace(/[^\w]/g, ""));
		response_body += `${mutation(item, 2, response_key)} `;
	})
	gql = `mutation batch_mutation{ ${response_body} }`;
	return mode === 1 ? gql : (mode === 2 ? response_body : runGqlImp("batch_mutation", gql));
}
//封装的批量查询的操作
function batch_query(list = [], mode = 3) {
	let response_body = ``;
	let gql = ``;
	list.forEach(item => {
		let response_key = item?.response_key || (item?.model.replace(/[^\w]/g, ""));
		response_body += `${query(item, 2, response_key)} `;
	})
	gql = `query batch_query{ ${response_body} }`;
	return mode === 1 ? gql : (mode === 2 ? response_body : runGqlImp("batch_query", gql));
}

// 获取相关认证的access_token
function getAuthtoken(args = {}) {
	let {
		type,
		app_id = null,
		params = {},
		fz_body,
		field_string,
		access_token_path,
		refresh_token_path,
		set_exp_seconds,
	} = args;
	if (!type) {
		return setReturn(args, "失败", "type必须传入");
	}
	let authtoken_field_string =
		`id type app_id thirdapi_name default_params default_fz_body default_field_string access_token_path refresh_token_path set_exp_seconds access_token refresh_token exp_time fetch_time set_default_num`;
	// 数据库中查出该条authtoken配置
	let [authtoken] = query({
		model: "authtoken",
		where: {
			type: {
				_eq: type
			},
			app_id: {
				_eq: app_id
			}
		},
		order_by: {
			set_default_num: "desc"
		},
		field_string: authtoken_field_string,
		limit: 1
	});
	if (!authtoken?.app_id) {
		return setReturn({
			args,
			authtoken
		}, "失败", "authtoken表模板未正确配置");
	}
	let now_time = new Date().getTime();
	if (now_time >= authtoken?.exp_time) {
		// token已过期，需要重新获取
		if (!authtoken?.thirdapi_name) {
			return setReturn({
				args,
				authtoken
			}, "失败", "请配置thirdapi_name");
		}

		// 定义一下fz_body和params的合并规则
		let tmp_fz_body = (typeof authtoken?.default_fz_body == "object" ? authtoken?.default_fz_body : null);
		if (typeof fz_body == "object" && tmp_fz_body) {
			fz_body = deepMerge(tmp_fz_body, fz_body || {});
		}

		let tmp_params = (typeof authtoken?.default_params == "object" ? authtoken?.default_params : null);
		if (typeof params == "object" && tmp_params) {
			params = deepMerge(tmp_params, params || {});
		}

		// 获取请求api的结果数据
		let thirdapi_res = callThirdapi({
			thirdapi_name: authtoken?.thirdapi_name,
			field_string: field_string || authtoken?.default_field_string,
			params,
			fz_body
		});
		let result = thirdapi_res?.field_200_json;

		//1.根据access_token_path取出access_token
		access_token_path = (access_token_path ?? authtoken?.access_token_path) || "access_token";
		let path_to_access_token = "result?." + access_token_path;
		let access_token = eval(path_to_access_token);

		//2.根据refresh_token_path取出refresh_token
		refresh_token_path = (refresh_token_path ?? authtoken?.refresh_token_path) || "refresh_token";
		let path_to_refresh_token = "result?." + refresh_token_path;
		let refresh_token = eval(path_to_refresh_token);

		if (!access_token) {
			return setReturn({
				params,
				fz_body,
				thirdapi_res,
				authtoken,
				path_to_access_token,
				access_token
			}, "失败", "access_token获取失败");
		}

		let set_exp_seconds = authtoken?.set_exp_seconds || 5;
		// 更新数据表
		let [authtoken_tmp] = mutation({
			operation: "update_authtoken",
			where: {
				id: {
					_eq: authtoken?.id
				}
			},
			_set: {
				access_token,
				refresh_token,
				exp_time: now_time + set_exp_seconds * 1000,
				fetch_time: now_time,
				set_default_num: now_time,
				result
			},
			field_string: authtoken_field_string
		})?.returning;
		if (!authtoken_tmp) {
			return setReturn({
				access_token,
				refresh_token,
				exp_time: now_time + set_exp_seconds * 1000,
				fetch_time: now_time,
				set_default_num: now_time,
				result,
				authtoken
			}, "失败", "update_authtoken失败");
		}
		authtoken = authtoken_tmp;
	}
	// token还能使用可以直接返回
	return authtoken
}
//**【尾】====================================================================================================【代码结束】